77ba7fd26f
This patch adds new field in node_list config that allows specifying name of libvirt domain associated with a node. * Now only 'ip' is required field for node. * Host moved from namedtuple to custom class. Change-Id: I47410d4e77c18a3874975812e09ea3bb7f3a574d
145 lines
3.8 KiB
Python
145 lines
3.8 KiB
Python
# 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 threading
|
|
|
|
import mock
|
|
|
|
from os_faults.tests.unit import test
|
|
from os_faults import utils
|
|
|
|
|
|
class MyException(Exception):
|
|
pass
|
|
|
|
|
|
class UtilsTestCase(test.TestCase):
|
|
|
|
def test_start_thread(self):
|
|
target = mock.Mock()
|
|
target_params = {'param1': 'val1', 'param2': 'val2'}
|
|
|
|
tw = utils.ThreadsWrapper()
|
|
tw.start_thread(target, **target_params)
|
|
tw.join_threads()
|
|
|
|
target.assert_has_calls([mock.call(param1='val1', param2='val2')])
|
|
self.assertIsInstance(tw.threads[0], threading.Thread)
|
|
self.assertEqual(len(tw.errors), 0)
|
|
|
|
def test_start_thread_raise_exception(self):
|
|
target = mock.Mock()
|
|
target.side_effect = MyException()
|
|
|
|
tw = utils.ThreadsWrapper()
|
|
tw.start_thread(target)
|
|
tw.join_threads()
|
|
|
|
self.assertEqual(type(tw.errors[0]), MyException)
|
|
|
|
def test_join_threads(self):
|
|
thread_1 = mock.Mock()
|
|
thread_2 = mock.Mock()
|
|
|
|
tw = utils.ThreadsWrapper()
|
|
tw.threads = [thread_1, thread_2]
|
|
tw.join_threads()
|
|
|
|
thread_1.join.assert_called_once()
|
|
thread_2.join.assert_called_once()
|
|
|
|
|
|
class MyClass(object):
|
|
FOO = 10
|
|
|
|
def __init__(self):
|
|
self.BAR = None
|
|
|
|
@utils.require_variables('FOO')
|
|
def method(self, a, b):
|
|
return self.FOO + a + b
|
|
|
|
@utils.require_variables('BAR', 'BAZ')
|
|
def method_that_miss_variables(self):
|
|
return self.BAR, self.BAZ
|
|
|
|
|
|
class RequiredVariablesTestCase(test.TestCase):
|
|
|
|
def test_require_variables(self):
|
|
inst = MyClass()
|
|
self.assertEqual(inst.method(1, b=2), 13)
|
|
|
|
def test_require_variables_not_implemented(self):
|
|
inst = MyClass()
|
|
err = self.assertRaises(NotImplementedError,
|
|
inst.method_that_miss_variables)
|
|
msg = 'BAR, BAZ required for MyClass.method_that_miss_variables'
|
|
self.assertEqual(str(err), msg)
|
|
|
|
|
|
class MyPoint(utils.ComparableMixin):
|
|
ATTRS = ('a', 'b')
|
|
|
|
def __init__(self, a, b):
|
|
self.a = a
|
|
self.b = b
|
|
|
|
|
|
class ComparableMixinTestCase(test.TestCase):
|
|
|
|
def test_operations(self):
|
|
p1 = MyPoint(1, 'a')
|
|
p2 = MyPoint(1, 'b')
|
|
p3 = MyPoint(2, 'c')
|
|
p4 = MyPoint(2, 'c')
|
|
|
|
self.assertTrue(p1 < p2)
|
|
self.assertTrue(p1 <= p2)
|
|
self.assertFalse(p1 == p2)
|
|
self.assertFalse(p1 >= p2)
|
|
self.assertFalse(p1 > p2)
|
|
self.assertTrue(p1 != p2)
|
|
self.assertTrue(hash(p1) != hash(p2))
|
|
|
|
self.assertTrue(p2 < p3)
|
|
self.assertTrue(p2 <= p3)
|
|
self.assertFalse(p2 == p3)
|
|
self.assertFalse(p2 >= p3)
|
|
self.assertFalse(p2 > p3)
|
|
self.assertTrue(p2 != p3)
|
|
self.assertTrue(hash(p2) != hash(p3))
|
|
|
|
self.assertFalse(p3 < p4)
|
|
self.assertTrue(p3 <= p4)
|
|
self.assertTrue(p3 == p4)
|
|
self.assertTrue(p3 >= p4)
|
|
self.assertFalse(p3 > p4)
|
|
self.assertFalse(p3 != p4)
|
|
self.assertEqual(hash(p3), hash(p4))
|
|
|
|
|
|
class MyRepr(utils.ReprMixin):
|
|
REPR_ATTRS = ('a', 'b', 'c')
|
|
|
|
def __init__(self):
|
|
self.a = 'foo'
|
|
self.b = {'foo': 'bar'}
|
|
self.c = 42
|
|
|
|
|
|
class ReprMixinTestCase(test.TestCase):
|
|
|
|
def test_repr(self):
|
|
r = MyRepr()
|
|
self.assertEqual("MyRepr(a='foo', b={'foo': 'bar'}, c=42)", repr(r))
|