Beef up address scope functional tests

We need to get more thorough in our functional testing, so start by
adding tests for all create and set options, check return values.

This also removes most of the setupClass() and teardownClass()
methods as they held common state that was subject to race conditions
when running tests in parallel.

Change-Id: Ib337f9e9d16b4183bb319b58cbe943045f365ff2
This commit is contained in:
Dean Troyer 2016-12-29 14:51:35 -06:00
parent 17a249c5dd
commit 241e0ec1cd

View File

@ -10,6 +10,7 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
import re
import uuid import uuid
from openstackclient.tests.functional import base from openstackclient.tests.functional import base
@ -17,33 +18,138 @@ from openstackclient.tests.functional import base
class AddressScopeTests(base.TestCase): class AddressScopeTests(base.TestCase):
"""Functional tests for address scope. """ """Functional tests for address scope. """
NAME = uuid.uuid4().hex
HEADERS = ['Name'] # NOTE(dtroyer): Do not normalize the setup and teardown of the resource
FIELDS = ['name'] # creation and deletion. Little is gained when each test
# has its own needs and there are collisions when running
# tests in parallel.
@classmethod @classmethod
def setUpClass(cls): def setUpClass(cls):
opts = cls.get_opts(cls.FIELDS) # Set up some regex for matching below
raw_output = cls.openstack('address scope create ' + cls.NAME + opts) cls.re_name = re.compile("name\s+\|\s+([^|]+?)\s+\|")
cls.assertOutput(cls.NAME + "\n", raw_output) cls.re_ip_version = re.compile("ip_version\s+\|\s+(\S+)")
cls.re_shared = re.compile("shared\s+\|\s+(\S+)")
@classmethod def test_address_scope_delete(self):
def tearDownClass(cls): """Test create, delete multiple"""
raw_output = cls.openstack('address scope delete ' + cls.NAME) name1 = uuid.uuid4().hex
cls.assertOutput('', raw_output) raw_output = self.openstack(
'address scope create ' + name1,
)
self.assertEqual(
name1,
re.search(self.re_name, raw_output).group(1),
)
# Check the default values
self.assertEqual(
'False',
re.search(self.re_shared, raw_output).group(1),
)
name2 = uuid.uuid4().hex
raw_output = self.openstack(
'address scope create ' + name2,
)
self.assertEqual(
name2,
re.search(self.re_name, raw_output).group(1),
)
raw_output = self.openstack(
'address scope delete ' + name1 + ' ' + name2,
)
self.assertOutput('', raw_output)
def test_address_scope_list(self): def test_address_scope_list(self):
opts = self.get_opts(self.HEADERS) """Test create defaults, list filters, delete"""
raw_output = self.openstack('address scope list' + opts) name1 = uuid.uuid4().hex
self.assertIn(self.NAME, raw_output) raw_output = self.openstack(
'address scope create --ip-version 4 --share ' + name1,
)
self.addCleanup(self.openstack, 'address scope delete ' + name1)
self.assertEqual(
'4',
re.search(self.re_ip_version, raw_output).group(1),
)
self.assertEqual(
'True',
re.search(self.re_shared, raw_output).group(1),
)
def test_address_scope_show(self): name2 = uuid.uuid4().hex
opts = self.get_opts(self.FIELDS) raw_output = self.openstack(
raw_output = self.openstack('address scope show ' + self.NAME + opts) 'address scope create --ip-version 6 --no-share ' + name2,
self.assertEqual(self.NAME + "\n", raw_output) )
self.addCleanup(self.openstack, 'address scope delete ' + name2)
self.assertEqual(
'6',
re.search(self.re_ip_version, raw_output).group(1),
)
self.assertEqual(
'False',
re.search(self.re_shared, raw_output).group(1),
)
# Test list
raw_output = self.openstack('address scope list')
self.assertIsNotNone(re.search(name1 + "\s+\|\s+4", raw_output))
self.assertIsNotNone(re.search(name2 + "\s+\|\s+6", raw_output))
# Test list --share
# TODO(dtroyer): returns 'HttpException: Bad Request'
# raw_output = self.openstack('address scope list --share')
# self.assertIsNotNone(re.search(name1 + "\s+\|\s+4", raw_output))
# self.assertIsNotNone(re.search(name2 + "\s+\|\s+6", raw_output))
# Test list --no-share
# TODO(dtroyer): returns 'HttpException: Bad Request'
# raw_output = self.openstack('address scope list --no-share')
# self.assertIsNotNone(re.search(name1 + "\s+\|\s+4", raw_output))
# self.assertIsNotNone(re.search(name2 + "\s+\|\s+6", raw_output))
def test_address_scope_set(self): def test_address_scope_set(self):
self.openstack('address scope set --share ' + self.NAME) """Tests create options, set, show, delete"""
opts = self.get_opts(['shared']) name = uuid.uuid4().hex
raw_output = self.openstack('address scope show ' + self.NAME + opts) newname = name + "_"
self.assertEqual("True\n", raw_output) raw_output = self.openstack(
'address scope create ' +
'--ip-version 4 ' +
'--no-share ' +
name,
)
self.addCleanup(self.openstack, 'address scope delete ' + newname)
self.assertEqual(
name,
re.search(self.re_name, raw_output).group(1),
)
self.assertEqual(
'4',
re.search(self.re_ip_version, raw_output).group(1),
)
self.assertEqual(
'False',
re.search(self.re_shared, raw_output).group(1),
)
raw_output = self.openstack(
'address scope set ' +
'--name ' + newname +
' --share ' +
name,
)
self.assertOutput('', raw_output)
raw_output = self.openstack('address scope show ' + newname)
self.assertEqual(
newname,
re.search(self.re_name, raw_output).group(1),
)
self.assertEqual(
'4',
re.search(self.re_ip_version, raw_output).group(1),
)
self.assertEqual(
'True',
re.search(self.re_shared, raw_output).group(1),
)