diff options
Diffstat (limited to 'yardstick/tests/unit/apiserver')
9 files changed, 265 insertions, 0 deletions
diff --git a/yardstick/tests/unit/apiserver/__init__.py b/yardstick/tests/unit/apiserver/__init__.py new file mode 100644 index 000000000..44d163429 --- /dev/null +++ b/yardstick/tests/unit/apiserver/__init__.py @@ -0,0 +1,58 @@ +############################################################################## +# Copyright (c) 2017 +# +# 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 +############################################################################## +"""Tests for yardstick/api/server.py""" +from __future__ import absolute_import + +import mock +import os +import socket +import unittest +import tempfile + +from oslo_serialization import jsonutils + +from yardstick.common import constants as consts + + +class APITestCase(unittest.TestCase): + """Tests for the YardStick API server""" + def setUp(self): + self.db_fd, self.db_path = tempfile.mkstemp() + consts.SQLITE = 'sqlite:///{}'.format(self.db_path) + + # server calls gethostbyname which takes 4 seconds, and we should mock + # it anyway + self.socket_mock = mock.patch.dict("sys.modules", {"socket": mock.MagicMock( + **{"gethostbyname.return_value": "127.0.0.1", + "gethostname.return_value": "localhost"})}) + self.socket_mock.start() + try: + from api import server + except socket.gaierror: + self.app = None + return + + server.app.config['TESTING'] = True + self.app = server.app.test_client() + + server.init_db() + + def tearDown(self): + os.close(self.db_fd) + os.unlink(self.db_path) + self.socket_mock.stop() + + def _post(self, url, data): + headers = {'Content-Type': 'application/json'} + resp = self.app.post(url, data=jsonutils.dumps(data), headers=headers) + return jsonutils.loads(resp.data) + + def _get(self, url): + resp = self.app.get(url) + return jsonutils.loads(resp.data) diff --git a/yardstick/tests/unit/apiserver/resources/__init__.py b/yardstick/tests/unit/apiserver/resources/__init__.py new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/yardstick/tests/unit/apiserver/resources/__init__.py diff --git a/yardstick/tests/unit/apiserver/resources/test_env_action.py b/yardstick/tests/unit/apiserver/resources/test_env_action.py new file mode 100644 index 000000000..657841669 --- /dev/null +++ b/yardstick/tests/unit/apiserver/resources/test_env_action.py @@ -0,0 +1,35 @@ +############################################################################## +# Copyright (c) 2017 Huawei Technologies Co.,Ltd and others. +# +# 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 time +import unittest + +from yardstick.tests.unit.apiserver import APITestCase + + +class EnvTestCase(APITestCase): + + def test_create_grafana(self): + if self.app is None: + unittest.skip('host config error') + return + + url = 'yardstick/env/action' + data = {'action': 'create_grafana'} + resp = self._post(url, data) + + time.sleep(0) + + task_id = resp['result']['task_id'] + url = '/yardstick/asynctask?task_id={}'.format(task_id) + resp = self._get(url) + + time.sleep(0) + + self.assertIn(u'status', resp) diff --git a/yardstick/tests/unit/apiserver/resources/v1/__init__.py b/yardstick/tests/unit/apiserver/resources/v1/__init__.py new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/yardstick/tests/unit/apiserver/resources/v1/__init__.py diff --git a/yardstick/tests/unit/apiserver/resources/v1/test_testsuites.py b/yardstick/tests/unit/apiserver/resources/v1/test_testsuites.py new file mode 100644 index 000000000..85c045f44 --- /dev/null +++ b/yardstick/tests/unit/apiserver/resources/v1/test_testsuites.py @@ -0,0 +1,35 @@ +############################################################################## +# Copyright (c) 2018 Huawei Technologies Co.,Ltd and others. +# +# 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 mock + +import unittest + +from yardstick.tests.unit.apiserver import APITestCase +from api.utils.thread import TaskThread + + +class TestsuiteTestCase(APITestCase): + + def test_run_test_suite(self): + if self.app is None: + unittest.skip('host config error') + return + + TaskThread.start = mock.MagicMock() + + url = 'yardstick/testsuites/action' + data = { + 'action': 'run_test_suite', + 'args': { + 'opts': {}, + 'testsuite': 'opnfv_smoke' + } + } + resp = self._post(url, data) + self.assertEqual(resp.get('status'), 1) diff --git a/yardstick/tests/unit/apiserver/resources/v2/__init__.py b/yardstick/tests/unit/apiserver/resources/v2/__init__.py new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/yardstick/tests/unit/apiserver/resources/v2/__init__.py diff --git a/yardstick/tests/unit/apiserver/resources/v2/test_images.py b/yardstick/tests/unit/apiserver/resources/v2/test_images.py new file mode 100644 index 000000000..ab131eec5 --- /dev/null +++ b/yardstick/tests/unit/apiserver/resources/v2/test_images.py @@ -0,0 +1,46 @@ +############################################################################## +# Copyright (c) 2017 Huawei Technologies Co.,Ltd. +# +# 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 mock + +import unittest + +from yardstick.tests.unit.apiserver import APITestCase +from api.resources.v2.images import format_image_info + + +class V2ImagesTestCase(APITestCase): + @mock.patch('yardstick.common.openstack_utils.list_images') + @mock.patch('yardstick.common.utils.source_env') + def test_get(self, _, mock_list_images): + if self.app is None: + unittest.skip('host config error') + return + + single_image = mock.MagicMock() + single_image.name = 'yardstick-image' + single_image.size = 16384 + single_image.status = 'active' + single_image.updated_at = '2018-04-08' + + mock_list_images.return_value = [single_image] + url = 'api/v2/yardstick/images' + resp = self._get(url) + self.assertEqual(resp.get('status'), 1) + + +class FormatImageInfoTestCase(unittest.TestCase): + def test_format_image_info(self): + image = mock.MagicMock() + image.name = 'yardstick-image' + image.size = 1048576 + image.status = 'active' + image.updated_at = '2018-04-08' + + image_dict = format_image_info(image) + self.assertEqual(image_dict.get('size'), 1) diff --git a/yardstick/tests/unit/apiserver/utils/__init__.py b/yardstick/tests/unit/apiserver/utils/__init__.py new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/yardstick/tests/unit/apiserver/utils/__init__.py diff --git a/yardstick/tests/unit/apiserver/utils/test_influx.py b/yardstick/tests/unit/apiserver/utils/test_influx.py new file mode 100644 index 000000000..3a97ff292 --- /dev/null +++ b/yardstick/tests/unit/apiserver/utils/test_influx.py @@ -0,0 +1,91 @@ +############################################################################## +# Copyright (c) 2016 Huawei Technologies Co.,Ltd and others. +# Copyright (c) 2019 Intel Corporation. +# +# 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 +############################################################################## + +from influxdb import client as influxdb_client +import mock +from six.moves import configparser + +from api.utils import influx +from yardstick.common import constants +from yardstick.common import exceptions +from yardstick import dispatcher +from yardstick.tests.unit import base + + +class GetDataDbClientTestCase(base.BaseUnitTestCase): + + @mock.patch.object(influx, '_get_influxdb_client', + return_value='fake_client') + @mock.patch.object(influx.ConfigParser, 'ConfigParser') + def test_get_data_db_client(self, mock_parser, mock_get_client): + _mock_parser = mock.Mock() + mock_parser.return_value = _mock_parser + + self.assertEqual('fake_client', influx.get_data_db_client()) + _mock_parser.read.assert_called_once_with(constants.CONF_FILE) + mock_get_client.assert_called_once_with(_mock_parser, None) + + @mock.patch.object(influx.logger, 'error') + @mock.patch.object(influx, '_get_influxdb_client', + return_value='fake_client') + @mock.patch.object(influx.ConfigParser, 'ConfigParser') + def test_get_data_db_client_parsing_error( + self, mock_parser, mock_get_client, *args): + _mock_parser = mock.Mock() + mock_parser.return_value = _mock_parser + mock_parser.NoOptionError = configparser.NoOptionError + mock_get_client.side_effect = configparser.NoOptionError('option', + 'section') + with self.assertRaises(configparser.NoOptionError): + influx.get_data_db_client() + + _mock_parser.read.assert_called_once_with(constants.CONF_FILE) + mock_get_client.assert_called_once_with(_mock_parser, None) + + +class GetIpTestCase(base.BaseUnitTestCase): + + def test_get_url(self): + url = 'http://localhost:8086/hello' + output = influx._get_ip(url) + + result = 'localhost' + self.assertEqual(result, output) + + +class GetInfluxdbTestCase(base.BaseUnitTestCase): + + @mock.patch.object(influxdb_client, 'InfluxDBClient', + return_value='idb_client') + @mock.patch.object(influx, '_get_ip', return_value='fake_ip') + def test_get_influxdb_client(self, mock_get_ip, mock_client): + mock_parser = mock.Mock() + mock_parser.get.side_effect = [dispatcher.INFLUXDB, 'target', 'user', + 'pass', 'db_name'] + + self.assertEqual('idb_client', + influx._get_influxdb_client(mock_parser)) + mock_client.assert_called_once_with('fake_ip', constants.INFLUXDB_PORT, + 'user', 'pass', 'db_name') + mock_get_ip.assert_called_once_with('target') + mock_parser.get.assert_has_calls([ + mock.call('DEFAULT', 'dispatcher'), + mock.call('dispatcher_influxdb', 'target'), + mock.call('dispatcher_influxdb', 'username'), + mock.call('dispatcher_influxdb', 'password'), + mock.call('dispatcher_influxdb', 'db_name')]) + + def test_get_influxdb_client_no_influxdb_client(self): + mock_parser = mock.Mock() + mock_parser.get.return_value = dispatcher.FILE + + with self.assertRaises(exceptions.InfluxDBConfigurationMissing): + influx._get_influxdb_client(mock_parser) + mock_parser.get.assert_called_once_with('DEFAULT', 'dispatcher') |