Refactor benchmark.core.test_plugin.PluginTestCase 57/47257/8
authorRodolfo Alonso Hernandez <rodolfo.alonso.hernandez@intel.com>
Wed, 15 Nov 2017 12:35:04 +0000 (12:35 +0000)
committerRodolfo Alonso Hernandez <rodolfo.alonso.hernandez@intel.com>
Fri, 16 Feb 2018 13:44:48 +0000 (13:44 +0000)
Tests in benchmark.core.test_plugin.PluginTestCase are not covering
correctly the functionality of the tested class.

YARDSTICK-851

Change-Id: I0b4cda7dbf109776a202167abfde8c9eb268db12
Signed-off-by: Rodolfo Alonso Hernandez <rodolfo.alonso.hernandez@intel.com>
yardstick/tests/fixture.py [new file with mode: 0644]
yardstick/tests/unit/benchmark/core/test_plugin.py

diff --git a/yardstick/tests/fixture.py b/yardstick/tests/fixture.py
new file mode 100644 (file)
index 0000000..94d20eb
--- /dev/null
@@ -0,0 +1,47 @@
+# Copyright 2017 Intel Corporation
+# All Rights Reserved.
+#
+#    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.
+
+import fixtures
+import mock
+import six
+
+from yardstick.common import task_template
+
+
+class PluginParserFixture(fixtures.Fixture):
+    """PluginParser fixture.
+
+    This class is intended to be used as a fixture within unit tests and
+    therefore consumers must register it using useFixture() within their
+    unit test class.
+    """
+
+    def __init__(self, rendered_plugin):
+        super(PluginParserFixture, self).__init__()
+        self._rendered_plugin = rendered_plugin
+
+    def _setUp(self):
+        self.addCleanup(self._restore)
+        self._mock_tasktemplate_render = mock.patch.object(
+            task_template.TaskTemplate, 'render')
+        self.mock_tasktemplate_render = self._mock_tasktemplate_render.start()
+        self.mock_tasktemplate_render.return_value = self._rendered_plugin
+        self._mock_open = mock.patch.object(six.moves.builtins, 'open', create=True)
+        self.mock_open = self._mock_open.start()
+        self.mock_open.side_effect = mock.mock_open()
+
+    def _restore(self):
+        self._mock_tasktemplate_render.stop()
+        self._mock_open.stop()
index 1d6e805..0d14e4e 100644 (file)
@@ -1,5 +1,3 @@
-#!/usr/bin/env python
-
 ##############################################################################
 # Copyright (c) 2016 Huawei Technologies Co.,Ltd and others.
 #
 # http://www.apache.org/licenses/LICENSE-2.0
 ##############################################################################
 
-# Unittest for yardstick.benchmark.core.plugin
-from __future__ import absolute_import
+import copy
 import os
-from os.path import dirname as dirname
+import pkg_resources
 
-try:
-    from unittest import mock
-except ImportError:
-    import mock
-import unittest
+import mock
+import testtools
 
+from yardstick import ssh
 from yardstick.benchmark.core import plugin
+from yardstick.tests import fixture
+
 
+class PluginTestCase(testtools.TestCase):
 
-class Arg(object):
+    FILE = """
+schema: "yardstick:plugin:0.1"
 
-    def __init__(self):
-        # self.input_file = ('plugin/sample_config.yaml',)
-        self.input_file = [
-            os.path.join(os.path.abspath(
-                dirname(dirname(dirname(dirname(dirname(dirname(__file__))))))),
-                'plugin/sample_config.yaml')]
+plugins:
+    name: sample
 
+deployment:
+    ip: 10.1.0.50
+    user: root
+    password: root
+"""
 
-@mock.patch('yardstick.benchmark.core.plugin.ssh')
-class pluginTestCase(unittest.TestCase):
+    NAME = 'sample'
+    DEPLOYMENT = {'ip': '10.1.0.50', 'user': 'root', 'password': 'root'}
 
     def setUp(self):
-        self.result = {}
-
-    def test_install(self, mock_ssh):
-        p = plugin.Plugin()
-        mock_ssh.SSH.from_node().execute.return_value = (0, '', '')
-        input_file = Arg()
-        p.install(input_file)
-        expected_result = {}
-        self.assertEqual(self.result, expected_result)
-
-    def test_remove(self, mock_ssh):
-        p = plugin.Plugin()
-        mock_ssh.SSH.from_node().execute.return_value = (0, '', '')
-        input_file = Arg()
-        p.remove(input_file)
-        expected_result = {}
-        self.assertEqual(self.result, expected_result)
-
-    def test_install_setup_run(self, mock_ssh):
-        p = plugin.Plugin()
-        mock_ssh.SSH.from_node().execute.return_value = (0, '', '')
-        plugins = {
-            "name": "sample"
-        }
-        deployment = {
-            "ip": "10.1.0.50",
-            "user": "root",
-            "password": "root"
-        }
-        plugin_name = plugins.get("name")
-        p._install_setup(plugin_name, deployment)
-        self.assertIsNotNone(p.client)
-
-        p._run(plugin_name)
-        expected_result = {}
-        self.assertEqual(self.result, expected_result)
-
-    def test_remove_setup_run(self, mock_ssh):
-        p = plugin.Plugin()
-        mock_ssh.SSH.from_node().execute.return_value = (0, '', '')
-        plugins = {
-            "name": "sample"
-        }
-        deployment = {
-            "ip": "10.1.0.50",
-            "user": "root",
-            "password": "root"
-        }
-        plugin_name = plugins.get("name")
-        p._remove_setup(plugin_name, deployment)
-        self.assertIsNotNone(p.client)
-
-        p._run(plugin_name)
-        expected_result = {}
-        self.assertEqual(self.result, expected_result)
-
-
-def main():
-    unittest.main()
-
-
-if __name__ == '__main__':
-    main()
+        super(PluginTestCase, self).setUp()
+        self.plugin_parser = plugin.PluginParser(mock.Mock())
+        self.plugin = plugin.Plugin()
+        self.useFixture(fixture.PluginParserFixture(PluginTestCase.FILE))
+
+        self._mock_ssh_from_node = mock.patch.object(ssh.SSH, 'from_node')
+        self.mock_ssh_from_node = self._mock_ssh_from_node.start()
+        self.mock_ssh_obj = mock.Mock()
+        self.mock_ssh_from_node.return_value = self.mock_ssh_obj
+        self.mock_ssh_obj.wait = mock.Mock()
+        self.mock_ssh_obj._put_file_shell = mock.Mock()
+
+        self.addCleanup(self._cleanup)
+
+    def _cleanup(self):
+        self._mock_ssh_from_node.stop()
+
+    def test_install(self):
+        args = mock.Mock()
+        args.input_file = [mock.Mock()]
+        with mock.patch.object(self.plugin, '_install_setup') as \
+                mock_install, \
+                mock.patch.object(self.plugin, '_run') as mock_run:
+            self.plugin.install(args)
+            mock_install.assert_called_once_with(PluginTestCase.NAME,
+                                                 PluginTestCase.DEPLOYMENT)
+            mock_run.assert_called_once_with(PluginTestCase.NAME)
+
+    def test_remove(self):
+        args = mock.Mock()
+        args.input_file = [mock.Mock()]
+        with mock.patch.object(self.plugin, '_remove_setup') as \
+                mock_remove, \
+                mock.patch.object(self.plugin, '_run') as mock_run:
+            self.plugin.remove(args)
+            mock_remove.assert_called_once_with(PluginTestCase.NAME,
+                                                PluginTestCase.DEPLOYMENT)
+            mock_run.assert_called_once_with(PluginTestCase.NAME)
+
+    @mock.patch.object(pkg_resources, 'resource_filename',
+                       return_value='script')
+    def test__install_setup(self, mock_resource_filename):
+        plugin_name = 'plugin_name'
+        self.plugin._install_setup(plugin_name, PluginTestCase.DEPLOYMENT)
+        mock_resource_filename.assert_called_once_with(
+            'yardstick.resources', 'scripts/install/' + plugin_name + '.bash')
+        self.mock_ssh_from_node.assert_called_once_with(
+            PluginTestCase.DEPLOYMENT)
+        self.mock_ssh_obj.wait.assert_called_once_with(timeout=600)
+        self.mock_ssh_obj._put_file_shell.assert_called_once_with(
+            'script', '~/{0}.sh'.format(plugin_name))
+
+    @mock.patch.object(pkg_resources, 'resource_filename',
+                       return_value='script')
+    @mock.patch.object(os, 'environ', return_value='1.2.3.4')
+    def test__install_setup_with_ip_local(self, mock_os_environ,
+                                          mock_resource_filename):
+        plugin_name = 'plugin_name'
+        deployment = copy.deepcopy(PluginTestCase.DEPLOYMENT)
+        deployment['ip'] = 'local'
+        self.plugin._install_setup(plugin_name, deployment)
+        mock_os_environ.__getitem__.assert_called_once_with('JUMP_HOST_IP')
+        mock_resource_filename.assert_called_once_with(
+            'yardstick.resources',
+            'scripts/install/' + plugin_name + '.bash')
+        self.mock_ssh_from_node.assert_called_once_with(
+            deployment, overrides={'ip': os.environ["JUMP_HOST_IP"]})
+        self.mock_ssh_obj.wait.assert_called_once_with(timeout=600)
+        self.mock_ssh_obj._put_file_shell.assert_called_once_with(
+            'script', '~/{0}.sh'.format(plugin_name))
+
+    @mock.patch.object(pkg_resources, 'resource_filename',
+                       return_value='script')
+    def test__remove_setup(self, mock_resource_filename):
+        plugin_name = 'plugin_name'
+        self.plugin._remove_setup(plugin_name, PluginTestCase.DEPLOYMENT)
+        mock_resource_filename.assert_called_once_with(
+            'yardstick.resources',
+            'scripts/remove/' + plugin_name + '.bash')
+        self.mock_ssh_from_node.assert_called_once_with(
+            PluginTestCase.DEPLOYMENT)
+        self.mock_ssh_obj.wait.assert_called_once_with(timeout=600)
+        self.mock_ssh_obj._put_file_shell.assert_called_once_with(
+            'script', '~/{0}.sh'.format(plugin_name))
+
+    @mock.patch.object(pkg_resources, 'resource_filename',
+                       return_value='script')
+    @mock.patch.object(os, 'environ', return_value='1.2.3.4')
+    def test__remove_setup_with_ip_local(self, mock_os_environ,
+                                         mock_resource_filename):
+        plugin_name = 'plugin_name'
+        deployment = copy.deepcopy(PluginTestCase.DEPLOYMENT)
+        deployment['ip'] = 'local'
+        self.plugin._remove_setup(plugin_name, deployment)
+        mock_os_environ.__getitem__.assert_called_once_with('JUMP_HOST_IP')
+        mock_resource_filename.assert_called_once_with(
+            'yardstick.resources',
+            'scripts/remove/' + plugin_name + '.bash')
+        self.mock_ssh_from_node.assert_called_once_with(
+            deployment, overrides={'ip': os.environ["JUMP_HOST_IP"]})
+        self.mock_ssh_obj.wait.assert_called_once_with(timeout=600)
+        self.mock_ssh_obj._put_file_shell.mock_os_environ(
+            'script', '~/{0}.sh'.format(plugin_name))