diff options
-rw-r--r-- | tempest_lib/common/utils/data_utils.py | 99 | ||||
-rw-r--r-- | tempest_lib/tests/common/__init__.py | 0 | ||||
-rw-r--r-- | tempest_lib/tests/common/utils/__init__.py | 0 | ||||
-rw-r--r-- | tempest_lib/tests/common/utils/test_data_utils.py | 77 | ||||
-rw-r--r-- | tempest_lib/tests/common/utils/test_misc.py | 88 |
5 files changed, 264 insertions, 0 deletions
diff --git a/tempest_lib/common/utils/data_utils.py b/tempest_lib/common/utils/data_utils.py new file mode 100644 index 0000000..eec2474 --- /dev/null +++ b/tempest_lib/common/utils/data_utils.py @@ -0,0 +1,99 @@ +# Copyright 2012 OpenStack Foundation +# 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 itertools +import netaddr +import random +import uuid + + +def rand_uuid(): + return str(uuid.uuid4()) + + +def rand_uuid_hex(): + return uuid.uuid4().hex + + +def rand_name(name=''): + randbits = str(random.randint(1, 0x7fffffff)) + if name: + return name + '-' + randbits + else: + return randbits + + +def rand_url(): + randbits = str(random.randint(1, 0x7fffffff)) + return 'https://url-' + randbits + '.com' + + +def rand_int_id(start=0, end=0x7fffffff): + return random.randint(start, end) + + +def rand_mac_address(): + """Generate an Ethernet MAC address.""" + # NOTE(vish): We would prefer to use 0xfe here to ensure that linux + # bridge mac addresses don't change, but it appears to + # conflict with libvirt, so we use the next highest octet + # that has the unicast and locally administered bits set + # properly: 0xfa. + # Discussion: https://bugs.launchpad.net/nova/+bug/921838 + mac = [0xfa, 0x16, 0x3e, + random.randint(0x00, 0xff), + random.randint(0x00, 0xff), + random.randint(0x00, 0xff)] + return ':'.join(["%02x" % x for x in mac]) + + +def parse_image_id(image_ref): + """Return the image id from a given image ref.""" + return image_ref.rsplit('/')[-1] + + +def arbitrary_string(size=4, base_text=None): + """Return size characters from base_text + + Repeating the base_text infinitely if needed. + """ + if not base_text: + base_text = 'test' + return ''.join(itertools.islice(itertools.cycle(base_text), size)) + + +def random_bytes(size=1024): + """Return size randomly selected bytes as a string.""" + return ''.join([chr(random.randint(0, 255)) + for i in range(size)]) + + +def get_ipv6_addr_by_EUI64(cidr, mac): + # Check if the prefix is IPv4 address + is_ipv4 = netaddr.valid_ipv4(cidr) + if is_ipv4: + msg = "Unable to generate IP address by EUI64 for IPv4 prefix" + raise TypeError(msg) + try: + eui64 = int(netaddr.EUI(mac).eui64()) + prefix = netaddr.IPNetwork(cidr) + return netaddr.IPAddress(prefix.first + eui64 ^ (1 << 57)) + except (ValueError, netaddr.AddrFormatError): + raise TypeError('Bad prefix or mac format for generating IPv6 ' + 'address by EUI-64: %(prefix)s, %(mac)s:' + % {'prefix': cidr, 'mac': mac}) + except TypeError: + raise TypeError('Bad prefix type for generate IPv6 address by ' + 'EUI-64: %s' % cidr) diff --git a/tempest_lib/tests/common/__init__.py b/tempest_lib/tests/common/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tempest_lib/tests/common/__init__.py diff --git a/tempest_lib/tests/common/utils/__init__.py b/tempest_lib/tests/common/utils/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tempest_lib/tests/common/utils/__init__.py diff --git a/tempest_lib/tests/common/utils/test_data_utils.py b/tempest_lib/tests/common/utils/test_data_utils.py new file mode 100644 index 0000000..76401cb --- /dev/null +++ b/tempest_lib/tests/common/utils/test_data_utils.py @@ -0,0 +1,77 @@ +# Copyright 2014 NEC 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. + + +from tempest_lib.common.utils import data_utils +from tempest_lib.tests import base + + +class TestDataUtils(base.TestCase): + + def test_rand_uuid(self): + actual = data_utils.rand_uuid() + self.assertIsInstance(actual, str) + self.assertRegexpMatches(actual, "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]" + "{4}-[0-9a-f]{4}-[0-9a-f]{12}$") + actual2 = data_utils.rand_uuid() + self.assertNotEqual(actual, actual2) + + def test_rand_uuid_hex(self): + actual = data_utils.rand_uuid_hex() + self.assertIsInstance(actual, str) + self.assertRegexpMatches(actual, "^[0-9a-f]{32}$") + + actual2 = data_utils.rand_uuid_hex() + self.assertNotEqual(actual, actual2) + + def test_rand_name(self): + actual = data_utils.rand_name() + self.assertIsInstance(actual, str) + actual2 = data_utils.rand_name() + self.assertNotEqual(actual, actual2) + + actual = data_utils.rand_name('foo') + self.assertTrue(actual.startswith('foo')) + actual2 = data_utils.rand_name('foo') + self.assertTrue(actual.startswith('foo')) + self.assertNotEqual(actual, actual2) + + def test_rand_int(self): + actual = data_utils.rand_int_id() + self.assertIsInstance(actual, int) + + actual2 = data_utils.rand_int_id() + self.assertNotEqual(actual, actual2) + + def test_rand_mac_address(self): + actual = data_utils.rand_mac_address() + self.assertIsInstance(actual, str) + self.assertRegexpMatches(actual, "^([0-9a-f][0-9a-f]:){5}" + "[0-9a-f][0-9a-f]$") + + actual2 = data_utils.rand_mac_address() + self.assertNotEqual(actual, actual2) + + def test_parse_image_id(self): + actual = data_utils.parse_image_id("/foo/bar/deadbeaf") + self.assertEqual("deadbeaf", actual) + + def test_arbitrary_string(self): + actual = data_utils.arbitrary_string() + self.assertEqual(actual, "test") + actual = data_utils.arbitrary_string(size=30, base_text="abc") + self.assertEqual(actual, "abc" * int(30 / len("abc"))) + actual = data_utils.arbitrary_string(size=5, base_text="deadbeaf") + self.assertEqual(actual, "deadb") diff --git a/tempest_lib/tests/common/utils/test_misc.py b/tempest_lib/tests/common/utils/test_misc.py new file mode 100644 index 0000000..aefaeef --- /dev/null +++ b/tempest_lib/tests/common/utils/test_misc.py @@ -0,0 +1,88 @@ +# Copyright 2014 NEC 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. + + +from tempest_lib.common.utils import misc +from tempest_lib.tests import base + + +@misc.singleton +class TestFoo(object): + + count = 0 + + def increment(self): + self.count += 1 + return self.count + + +@misc.singleton +class TestBar(object): + + count = 0 + + def increment(self): + self.count += 1 + return self.count + + +class TestMisc(base.TestCase): + + def test_singleton(self): + test = TestFoo() + self.assertEqual(0, test.count) + self.assertEqual(1, test.increment()) + test2 = TestFoo() + self.assertEqual(1, test.count) + self.assertEqual(1, test2.count) + self.assertEqual(test, test2) + test3 = TestBar() + self.assertNotEqual(test, test3) + + def test_find_test_caller_test_case(self): + # Calling it from here should give us the method we're in. + self.assertEqual('TestMisc:test_find_test_caller_test_case', + misc.find_test_caller()) + + def test_find_test_caller_setup_self(self): + def setUp(self): + return misc.find_test_caller() + self.assertEqual('TestMisc:setUp', setUp(self)) + + def test_find_test_caller_setup_no_self(self): + def setUp(): + return misc.find_test_caller() + self.assertEqual(':setUp', setUp()) + + def test_find_test_caller_setupclass_cls(self): + def setUpClass(cls): # noqa + return misc.find_test_caller() + self.assertEqual('TestMisc:setUpClass', setUpClass(self.__class__)) + + def test_find_test_caller_teardown_self(self): + def tearDown(self): + return misc.find_test_caller() + self.assertEqual('TestMisc:tearDown', tearDown(self)) + + def test_find_test_caller_teardown_no_self(self): + def tearDown(): + return misc.find_test_caller() + self.assertEqual(':tearDown', tearDown()) + + def test_find_test_caller_teardown_class(self): + def tearDownClass(cls): # noqa + return misc.find_test_caller() + self.assertEqual('TestMisc:tearDownClass', + tearDownClass(self.__class__)) |