Add functional test for crud resource

This commit is contained in:
Mehdi Abaakouk
2015-08-28 23:30:05 +02:00
parent 4568c38198
commit 593fec4669
9 changed files with 154 additions and 52 deletions

View File

@@ -2,6 +2,6 @@
test_command=OS_STDOUT_CAPTURE=${OS_STDOUT_CAPTURE:-1} \
OS_STDERR_CAPTURE=${OS_STDERR_CAPTURE:-1} \
OS_TEST_TIMEOUT=${OS_TEST_TIMEOUT:-60} \
${PYTHON:-python} -m subunit.run discover -t ./ . $LISTOPT $IDOPTION
${PYTHON:-python} -m subunit.run discover -t ./ ${OS_TEST_PATH:-./gnocchiclient/tests/unit} $LISTOPT $IDOPTION
test_id_option=--load-list $IDFILE
test_list_option=--list

View File

@@ -1,23 +0,0 @@
# -*- coding: utf-8 -*-
# Copyright 2010-2011 OpenStack Foundation
# Copyright (c) 2013 Hewlett-Packard Development Company, L.P.
#
# 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.
from oslotest import base
class TestCase(base.BaseTestCase):
"""Test case base class for all unit tests."""

View File

@@ -0,0 +1,35 @@
# 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 os
from tempest_lib.cli import base
class ClientTestBase(base.ClientTestBase):
"""Base class for gnocchiclient tests.
Establishes the gnocchi client and retrieves the essential environment
information.
"""
def _get_clients(self):
cli_dir = os.environ.get('OS_GNOCCHI_CLIENT_EXEC_DIR')
return base.CLIClient(
username=os.environ.get('OS_USERNAME'),
password=os.environ.get('OS_PASSWORD'),
tenant_name=os.environ.get('OS_TENANT_NAME'),
uri=os.environ.get('OS_AUTH_URL'),
cli_dir=cli_dir)
def gnocchi(self, *args, **kwargs):
return self.clients.cmd_with_auth('gnocchi', *args, **kwargs)

View File

@@ -0,0 +1,105 @@
# 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 uuid
from tempest_lib import exceptions
from gnocchiclient.tests.functional import base
class ResourceClientTest(base.ClientTestBase):
RESOURCE_ID = str(uuid.uuid4())
PROJECT_ID = str(uuid.uuid4())
def details_multiple(self, output_lines, with_label=False):
"""Return list of dicts with item details from cli output tables.
If with_label is True, key '__label' is added to each items dict.
For more about 'label' see OutputParser.tables().
NOTE(sileht): come from tempest-lib just because cliff use
Field instead of Property as first columun header.
"""
items = []
tables_ = self.parser.tables(output_lines)
for table_ in tables_:
if ('Field' not in table_['headers']
or 'Value' not in table_['headers']):
raise exceptions.InvalidStructure()
item = {}
for value in table_['values']:
item[value[0]] = value[1]
if with_label:
item['__label'] = table_['label']
items.append(item)
return items
def test_resource_scenario(self):
# CREATE
result = self.gnocchi(
'resource', params="create generic -a id:%s" % self.RESOURCE_ID)
resource = self.details_multiple(result)[0]
self.assertEqual(self.RESOURCE_ID, resource["id"])
self.assertEqual('None', resource["project_id"])
self.assertNotEqual('None', resource["started_at"])
# UPDATE
result = self.gnocchi(
'resource', params=("update generic %s -a project_id:%s" %
(self.RESOURCE_ID, self.PROJECT_ID)))
resource_updated = self.details_multiple(result)[0]
self.assertEqual(self.RESOURCE_ID, resource_updated["id"])
self.assertEqual(self.PROJECT_ID, resource_updated["project_id"])
self.assertEqual(resource["started_at"],
resource_updated["started_at"])
# GET
result = self.gnocchi(
'resource', params="show generic %s" % self.RESOURCE_ID)
resource_got = self.details_multiple(result)[0]
self.assertEqual(self.RESOURCE_ID, resource_got["id"])
self.assertEqual(self.PROJECT_ID, resource_got["project_id"])
self.assertEqual(resource["started_at"], resource_got["started_at"])
# LIST
result = self.gnocchi('resource', params="list generic")
self.assertIn(self.RESOURCE_ID,
[r['id'] for r in self.parser.listing(result)])
resource_list = [r for r in self.parser.listing(result)
if r['id'] == self.RESOURCE_ID][0]
self.assertEqual(self.RESOURCE_ID, resource_list["id"])
self.assertEqual(self.PROJECT_ID, resource_list["project_id"])
self.assertEqual(resource["started_at"], resource_list["started_at"])
# DELETE
result = self.gnocchi('resource',
params="delete %s" % self.RESOURCE_ID)
self.assertEqual("", result)
# GET FAIL
result = self.gnocchi('resource',
params="show generic %s" % self.RESOURCE_ID,
fail_ok=True, merge_stderr=True)
self.assertFirstLineStartsWith(result.split('\n'),
"Not Found (HTTP 404)")
# DELETE FAIL
result = self.gnocchi('resource',
params="delete %s" % self.RESOURCE_ID,
fail_ok=True, merge_stderr=True)
self.assertFirstLineStartsWith(result.split('\n'),
"Not Found (HTTP 404)")
# LIST EMPTY
result = self.gnocchi('resource', params="list generic")
self.assertNotIn(self.RESOURCE_ID,
[r['id'] for r in self.parser.listing(result)])

View File

@@ -1,28 +0,0 @@
# -*- coding: utf-8 -*-
# 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.
"""
test_gnocchiclient
----------------------------------
Tests for `gnocchiclient` module.
"""
from gnocchiclient.tests import base
class TestGnocchiclient(base.TestCase):
def test_something(self):
pass

View File

View File

@@ -10,6 +10,7 @@ python-subunit>=0.0.18
sphinx!=1.2.0,!=1.3b1,<1.3,>=1.1.2
oslosphinx>=2.5.0 # Apache-2.0
oslotest>=1.10.0 # Apache-2.0
tempest-lib>=0.6.1
testrepository>=0.0.18
testscenarios>=0.4
testtools>=1.4.0

12
tox.ini
View File

@@ -26,6 +26,18 @@ commands = python setup.py build_sphinx
[testenv:debug]
commands = oslo_debug_helper {posargs}
[testenv:py27-functional]
setenv =
OS_TEST_PATH=./gnocchiclient/tests/functional
OS_GNOCCHI_CLIENT_EXEC_DIR={envdir}/bin
passenv = OS_*
[testenv:py34-functional]
setenv =
OS_TEST_PATH=./gnocchiclient/tests/functional
OS_GNOCCHI_CLIENT_EXEC_DIR={envdir}/bin
passenv = OS_*
[flake8]
# E123, E125 skipped as they are invalid PEP-8.