Added Unit Tests for ci/prepare_env
authorashishk1994 <ashishk.iiit@gmail.com>
Wed, 21 Dec 2016 10:39:07 +0000 (16:09 +0530)
committerashishk1994 <ashishk.iiit@gmail.com>
Wed, 1 Mar 2017 10:45:51 +0000 (16:15 +0530)
JIRA: FUNCTEST-663

Change-Id: Ie240b5f24d11e3a6079cafd260d9d48ed36d3d0a
Signed-off-by: ashishk1994 <ashishk.iiit@gmail.com>
functest/tests/unit/ci/__init__.py [new file with mode: 0644]
functest/tests/unit/ci/test_prepare_env.py [new file with mode: 0644]

diff --git a/functest/tests/unit/ci/__init__.py b/functest/tests/unit/ci/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/functest/tests/unit/ci/test_prepare_env.py b/functest/tests/unit/ci/test_prepare_env.py
new file mode 100644 (file)
index 0000000..41b3f6a
--- /dev/null
@@ -0,0 +1,345 @@
+#!/usr/bin/env python
+
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+
+import logging
+import unittest
+
+import mock
+
+from functest.ci import prepare_env
+from functest.tests.unit import test_utils
+from functest.utils.constants import CONST
+from opnfv.utils import constants as opnfv_constants
+
+
+class PrepareEnvTesting(unittest.TestCase):
+
+    logging.disable(logging.CRITICAL)
+
+    @mock.patch('functest.ci.prepare_env.logger.info')
+    def test_print_separator(self, mock_logger_info):
+        str = "=============================================="
+        prepare_env.print_separator()
+        mock_logger_info.assert_called_once_with(str)
+
+    @mock.patch('functest.ci.prepare_env.logger.info')
+    @mock.patch('functest.ci.prepare_env.logger.warning')
+    def test_check_env_variables_missing_inst_type(self, mock_logger_warn,
+                                                   mock_logger_info):
+        CONST.INSTALLER_TYPE = None
+        prepare_env.check_env_variables()
+        mock_logger_info.assert_any_call("Checking environment variables"
+                                         "...")
+        mock_logger_warn.assert_any_call("The env variable 'INSTALLER_TYPE'"
+                                         " is not defined.")
+
+    @mock.patch('functest.ci.prepare_env.logger.info')
+    @mock.patch('functest.ci.prepare_env.logger.warning')
+    def test_check_env_variables_missing_inst_ip(self, mock_logger_warn,
+                                                 mock_logger_info):
+        CONST.INSTALLER_IP = None
+        prepare_env.check_env_variables()
+        mock_logger_info.assert_any_call("Checking environment variables"
+                                         "...")
+        mock_logger_warn.assert_any_call("The env variable 'INSTALLER_IP'"
+                                         " is not defined. It is needed to"
+                                         " fetch the OpenStack credentials."
+                                         " If the credentials are not"
+                                         " provided to the container as a"
+                                         " volume, please add this env"
+                                         " variable to the 'docker run'"
+                                         " command.")
+
+    @mock.patch('functest.ci.prepare_env.logger.info')
+    @mock.patch('functest.ci.prepare_env.logger.warning')
+    def test_check_env_variables_with_inst_ip(self, mock_logger_warn,
+                                              mock_logger_info):
+        CONST.INSTALLER_IP = mock.Mock()
+        prepare_env.check_env_variables()
+        mock_logger_info.assert_any_call("Checking environment variables"
+                                         "...")
+        mock_logger_info.assert_any_call(test_utils.
+                                         SubstrMatch("    INSTALLER_IP="))
+
+    @mock.patch('functest.ci.prepare_env.logger.info')
+    @mock.patch('functest.ci.prepare_env.logger.warning')
+    def test_check_env_variables_missing_scenario(self, mock_logger_warn,
+                                                  mock_logger_info):
+        CONST.DEPLOY_SCENARIO = None
+        prepare_env.check_env_variables()
+        mock_logger_info.assert_any_call("Checking environment variables"
+                                         "...")
+        mock_logger_warn.assert_any_call("The env variable"
+                                         " 'DEPLOY_SCENARIO' is not defined"
+                                         ". Setting CI_SCENARIO=undefined.")
+
+    @mock.patch('functest.ci.prepare_env.logger.info')
+    @mock.patch('functest.ci.prepare_env.logger.warning')
+    def test_check_env_variables_with_scenario(self, mock_logger_warn,
+                                               mock_logger_info):
+        CONST.DEPLOY_SCENARIO = mock.Mock()
+        prepare_env.check_env_variables()
+        mock_logger_info.assert_any_call("Checking environment variables"
+                                         "...")
+        mock_logger_info.assert_any_call(test_utils.
+                                         SubstrMatch("DEPLOY_SCENARIO="))
+
+    @mock.patch('functest.ci.prepare_env.logger.info')
+    @mock.patch('functest.ci.prepare_env.logger.warning')
+    def test_check_env_variables_with_ci_debug(self, mock_logger_warn,
+                                               mock_logger_info):
+        CONST.CI_DEBUG = mock.Mock()
+        prepare_env.check_env_variables()
+        mock_logger_info.assert_any_call("Checking environment variables"
+                                         "...")
+        mock_logger_info.assert_any_call(test_utils.
+                                         SubstrMatch("    CI_DEBUG="))
+
+    @mock.patch('functest.ci.prepare_env.logger.info')
+    @mock.patch('functest.ci.prepare_env.logger.warning')
+    def test_check_env_variables_with_node(self, mock_logger_warn,
+                                           mock_logger_info):
+        CONST.NODE_NAME = mock.Mock()
+        prepare_env.check_env_variables()
+        mock_logger_info.assert_any_call("Checking environment variables"
+                                         "...")
+        mock_logger_info.assert_any_call(test_utils.
+                                         SubstrMatch("    NODE_NAME="))
+
+    @mock.patch('functest.ci.prepare_env.logger.info')
+    @mock.patch('functest.ci.prepare_env.logger.warning')
+    def test_check_env_variables_with_build_tag(self, mock_logger_warn,
+                                                mock_logger_info):
+        CONST.BUILD_TAG = mock.Mock()
+        prepare_env.check_env_variables()
+        mock_logger_info.assert_any_call("Checking environment variables"
+                                         "...")
+
+        mock_logger_info.assert_any_call(test_utils.
+                                         SubstrMatch("    BUILD_TAG="))
+
+    @mock.patch('functest.ci.prepare_env.logger.info')
+    @mock.patch('functest.ci.prepare_env.logger.warning')
+    def test_check_env_variables_with_is_ci_run(self, mock_logger_warn,
+                                                mock_logger_info):
+        CONST.IS_CI_RUN = mock.Mock()
+        prepare_env.check_env_variables()
+        mock_logger_info.assert_any_call("Checking environment variables"
+                                         "...")
+
+        mock_logger_info.assert_any_call(test_utils.
+                                         SubstrMatch("    IS_CI_RUN="))
+
+    @mock.patch('functest.ci.prepare_env.logger.info')
+    @mock.patch('functest.ci.prepare_env.logger.debug')
+    def test_create_directories_missing_dir(self, mock_logger_debug,
+                                            mock_logger_info):
+        with mock.patch('functest.ci.prepare_env.os.path.exists',
+                        return_value=False), \
+                mock.patch('functest.ci.prepare_env.os.makedirs') \
+                as mock_method:
+            prepare_env.create_directories()
+            mock_logger_info.assert_any_call("Creating needed directories...")
+            mock_method.assert_any_call(CONST.dir_functest_conf)
+            mock_method.assert_any_call(CONST.dir_functest_data)
+            mock_logger_info.assert_any_call("    %s created." %
+                                             CONST.dir_functest_conf)
+            mock_logger_info.assert_any_call("    %s created." %
+                                             CONST.dir_functest_data)
+
+    @mock.patch('functest.ci.prepare_env.logger.info')
+    @mock.patch('functest.ci.prepare_env.logger.debug')
+    def test_create_directories_with_dir(self, mock_logger_debug,
+                                         mock_logger_info):
+        with mock.patch('functest.ci.prepare_env.os.path.exists',
+                        return_value=True):
+            prepare_env.create_directories()
+            mock_logger_info.assert_any_call("Creating needed directories...")
+            mock_logger_debug.assert_any_call("   %s already exists." %
+                                              CONST.dir_functest_conf)
+            mock_logger_debug.assert_any_call("   %s already exists." %
+                                              CONST.dir_functest_data)
+
+    def _get_env_cred_dict(self, os_prefix=''):
+        return {'OS_USERNAME': os_prefix + 'username',
+                'OS_PASSWORD': os_prefix + 'password',
+                'OS_AUTH_URL': 'http://test_ip:test_port/v2.0',
+                'OS_TENANT_NAME': os_prefix + 'tenant_name',
+                'OS_USER_DOMAIN_NAME': os_prefix + 'user_domain_name',
+                'OS_PROJECT_DOMAIN_NAME': os_prefix + 'project_domain_name',
+                'OS_PROJECT_NAME': os_prefix + 'project_name',
+                'OS_ENDPOINT_TYPE': os_prefix + 'endpoint_type',
+                'OS_REGION_NAME': os_prefix + 'region_name'}
+
+    @mock.patch('functest.ci.prepare_env.logger.error')
+    @mock.patch('functest.ci.prepare_env.logger.info')
+    @mock.patch('functest.ci.prepare_env.logger.warning')
+    def test_source_rc_missing_rc_file(self, mock_logger_warn,
+                                       mock_logger_info,
+                                       mock_logger_error):
+        with mock.patch('functest.ci.prepare_env.os.path.isfile',
+                        return_value=True), \
+                mock.patch('functest.ci.prepare_env.os.path.getsize',
+                           return_value=0), \
+                self.assertRaises(Exception):
+            CONST.openstack_creds = 'test_creds'
+            prepare_env.source_rc_file()
+
+    def test_source_rc_missing_installer_ip(self):
+        with mock.patch('functest.ci.prepare_env.os.path.isfile',
+                        return_value=False), \
+                self.assertRaises(Exception):
+            CONST.INSTALLER_IP = None
+            CONST.openstack_creds = 'test_creds'
+            prepare_env.source_rc_file()
+
+    def test_source_rc_missing_installer_type(self):
+        with mock.patch('functest.ci.prepare_env.os.path.isfile',
+                        return_value=False), \
+                self.assertRaises(Exception):
+            CONST.INSTALLER_IP = 'test_ip'
+            CONST.openstack_creds = 'test_creds'
+            CONST.INSTALLER_TYPE = 'test_type'
+            opnfv_constants.INSTALLERS = []
+            prepare_env.source_rc_file()
+
+    def test_source_rc_missing_os_credfile_ci_inst(self):
+        with mock.patch('functest.ci.prepare_env.os.path.isfile',
+                        return_value=False), \
+                mock.patch('functest.ci.prepare_env.os.path.getsize'), \
+                mock.patch('functest.ci.prepare_env.os.path.join'), \
+                mock.patch('functest.ci.prepare_env.subprocess.Popen') \
+                as mock_subproc_popen, \
+                self.assertRaises(Exception):
+            CONST.openstack_creds = 'test_creds'
+            CONST.INSTALLER_IP = None
+            CONST.INSTALLER_TYPE = 'test_type'
+            opnfv_constants.INSTALLERS = ['test_type']
+
+            process_mock = mock.Mock()
+            attrs = {'communicate.return_value': ('output', 'error'),
+                     'return_code': 1}
+            process_mock.configure_mock(**attrs)
+            mock_subproc_popen.return_value = process_mock
+
+            prepare_env.source_rc_file()
+
+    def _get_rally_creds(self):
+        return {"type": "ExistingCloud",
+                "admin": {"username": 'test_user_name',
+                          "password": 'test_password',
+                          "tenant": 'test_tenant'}}
+
+    @mock.patch('functest.ci.prepare_env.os_utils.get_credentials_for_rally')
+    @mock.patch('functest.ci.prepare_env.logger.info')
+    @mock.patch('functest.ci.prepare_env.ft_utils.execute_command')
+    def test_install_rally(self, mock_exec, mock_logger_info, mock_os_utils):
+
+        mock_os_utils.return_value = self._get_rally_creds()
+
+        prepare_env.install_rally()
+
+        cmd = "rally deployment destroy opnfv-rally"
+        error_msg = "Deployment %s does not exist." % \
+                    CONST.rally_deployment_name
+        mock_logger_info.assert_any_call("Creating Rally environment...")
+        mock_exec.assert_any_call(cmd, error_msg=error_msg, verbose=False)
+
+        cmd = "rally deployment create --file=rally_conf.json --name="
+        cmd += CONST.rally_deployment_name
+        error_msg = "Problem while creating Rally deployment"
+        mock_exec.assert_any_call(cmd, error_msg=error_msg)
+
+        cmd = "rally deployment check"
+        error_msg = ("OpenStack not responding or "
+                     "faulty Rally deployment.")
+        mock_exec.assert_any_call(cmd, error_msg=error_msg)
+
+        cmd = "rally deployment list"
+        error_msg = ("Problem while listing "
+                     "Rally deployment.")
+        mock_exec.assert_any_call(cmd, error_msg=error_msg)
+
+        cmd = "rally plugin list | head -5"
+        error_msg = ("Problem while showing "
+                     "Rally plugins.")
+        mock_exec.assert_any_call(cmd, error_msg=error_msg)
+
+    @mock.patch('functest.ci.prepare_env.sys.exit')
+    @mock.patch('functest.ci.prepare_env.logger.error')
+    def test_check_environment_missing_file(self, mock_logger_error,
+                                            mock_sys_exit):
+        with mock.patch('functest.ci.prepare_env.os.path.isfile',
+                        return_value=False), \
+                self.assertRaises(Exception):
+                prepare_env.check_environment()
+
+    @mock.patch('functest.ci.prepare_env.sys.exit')
+    @mock.patch('functest.ci.prepare_env.logger.error')
+    def test_check_environment_with_error(self, mock_logger_error,
+                                          mock_sys_exit):
+        with mock.patch('functest.ci.prepare_env.os.path.isfile',
+                        return_value=True), \
+            mock.patch("__builtin__.open", mock.mock_open(read_data='0')), \
+                self.assertRaises(Exception):
+            prepare_env.check_environment()
+
+    @mock.patch('functest.ci.prepare_env.logger.info')
+    def test_check_environment_default(self, mock_logger_info):
+        with mock.patch('functest.ci.prepare_env.os.path.isfile',
+                        return_value=True):
+            with mock.patch("__builtin__.open", mock.mock_open(read_data='1')):
+                prepare_env.check_environment()
+                mock_logger_info.assert_any_call("Functest environment"
+                                                 " is installed.")
+
+    @mock.patch('functest.ci.prepare_env.check_environment')
+    @mock.patch('functest.ci.prepare_env.create_flavor')
+    @mock.patch('functest.ci.prepare_env.install_tempest')
+    @mock.patch('functest.ci.prepare_env.install_rally')
+    @mock.patch('functest.ci.prepare_env.verify_deployment')
+    @mock.patch('functest.ci.prepare_env.patch_config_file')
+    @mock.patch('functest.ci.prepare_env.source_rc_file')
+    @mock.patch('functest.ci.prepare_env.create_directories')
+    @mock.patch('functest.ci.prepare_env.check_env_variables')
+    @mock.patch('functest.ci.prepare_env.logger.info')
+    def test_main_start(self, mock_logger_info, mock_env_var,
+                        mock_create_dir, mock_source_rc, mock_patch_config,
+                        mock_verify_depl, mock_install_rally,
+                        mock_install_temp, mock_create_flavor,
+                        mock_check_env):
+        with mock.patch("__builtin__.open", mock.mock_open()) as m:
+            args = {'action': 'start'}
+            self.assertEqual(prepare_env.main(**args), 0)
+            mock_logger_info.assert_any_call("######### Preparing Functest "
+                                             "environment #########\n")
+            self.assertTrue(mock_env_var.called)
+            self.assertTrue(mock_create_dir.called)
+            self.assertTrue(mock_source_rc.called)
+            self.assertTrue(mock_patch_config.called)
+            self.assertTrue(mock_verify_depl.called)
+            self.assertTrue(mock_install_rally.called)
+            self.assertTrue(mock_install_temp.called)
+            self.assertTrue(mock_create_flavor.called)
+            m.assert_called_once_with(CONST.env_active, "w")
+            self.assertTrue(mock_check_env.called)
+
+    @mock.patch('functest.ci.prepare_env.check_environment')
+    def test_main_check(self, mock_check_env):
+        args = {'action': 'check'}
+        self.assertEqual(prepare_env.main(**args), 0)
+        self.assertTrue(mock_check_env.called)
+
+    @mock.patch('functest.ci.prepare_env.logger.error')
+    def test_main_no_arg(self, mock_logger_error):
+        args = {'action': 'not_valid'}
+        self.assertEqual(prepare_env.main(**args), -1)
+        mock_logger_error.assert_called_once_with('Argument not valid.')
+
+
+if __name__ == "__main__":
+    unittest.main(verbosity=2)