summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2013-06-12 18:30:29 +0000
committerGerrit Code Review <review@openstack.org>2013-06-12 18:30:29 +0000
commit151d027b2002c5d9b188006ef05515c615d72419 (patch)
tree20ebf76071dfc70d5a848a7855f885af7623ca55 /tests
parent706fa4b31d1e13ab8774bcd10a917849d14033d9 (diff)
parentd7970343cfd880817ac7985e328c9a8fe5cf6b73 (diff)
downloadoslo-151d027b2002c5d9b188006ef05515c615d72419.tar.gz
oslo-151d027b2002c5d9b188006ef05515c615d72419.tar.xz
oslo-151d027b2002c5d9b188006ef05515c615d72419.zip
Merge "Add a funcutils file for working with functions."
Diffstat (limited to 'tests')
-rw-r--r--tests/unit/test_funcutils.py139
1 files changed, 139 insertions, 0 deletions
diff --git a/tests/unit/test_funcutils.py b/tests/unit/test_funcutils.py
new file mode 100644
index 0000000..439d825
--- /dev/null
+++ b/tests/unit/test_funcutils.py
@@ -0,0 +1,139 @@
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+# Copyright 2011 OpenStack Foundation.
+# Copyright 2011 Justin Santa Barbara
+#
+# 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 functools
+
+from openstack.common import funcutils
+
+from tests import utils
+
+
+class FuncutilsTestCase(utils.BaseTestCase):
+ def _test_func(self, instance, red=None, blue=None):
+ pass
+
+ def test_all_kwargs(self):
+ args = ()
+ kwargs = {'instance': {'uuid': 1}, 'red': 3, 'blue': 4}
+ callargs = funcutils.getcallargs(self._test_func, *args, **kwargs)
+
+ #implicit self counts as an arg
+ self.assertEqual(4, len(callargs))
+ self.assertTrue('instance' in callargs)
+ self.assertEqual({'uuid': 1}, callargs['instance'])
+ self.assertTrue('red' in callargs)
+ self.assertEqual(3, callargs['red'])
+ self.assertTrue('blue' in callargs)
+ self.assertEqual(4, callargs['blue'])
+
+ def test_all_args(self):
+ args = ({'uuid': 1}, 3, 4)
+ kwargs = {}
+ callargs = funcutils.getcallargs(self._test_func, *args, **kwargs)
+
+ #implicit self counts as an arg
+ self.assertEqual(4, len(callargs))
+ self.assertTrue('instance' in callargs)
+ self.assertEqual({'uuid': 1}, callargs['instance'])
+ self.assertTrue('red' in callargs)
+ self.assertEqual(3, callargs['red'])
+ self.assertTrue('blue' in callargs)
+ self.assertEqual(4, callargs['blue'])
+
+ def test_mixed_args(self):
+ args = ({'uuid': 1}, 3)
+ kwargs = {'blue': 4}
+ callargs = funcutils.getcallargs(self._test_func, *args, **kwargs)
+
+ #implicit self counts as an arg
+ self.assertEqual(4, len(callargs))
+ self.assertTrue('instance' in callargs)
+ self.assertEqual({'uuid': 1}, callargs['instance'])
+ self.assertTrue('red' in callargs)
+ self.assertEqual(3, callargs['red'])
+ self.assertTrue('blue' in callargs)
+ self.assertEqual(4, callargs['blue'])
+
+ def test_partial_kwargs(self):
+ args = ()
+ kwargs = {'instance': {'uuid': 1}, 'red': 3}
+ callargs = funcutils.getcallargs(self._test_func, *args, **kwargs)
+
+ #implicit self counts as an arg
+ self.assertEqual(4, len(callargs))
+ self.assertTrue('instance' in callargs)
+ self.assertEqual({'uuid': 1}, callargs['instance'])
+ self.assertTrue('red' in callargs)
+ self.assertEqual(3, callargs['red'])
+ self.assertTrue('blue' in callargs)
+ self.assertEqual(None, callargs['blue'])
+
+ def test_partial_args(self):
+ args = ({'uuid': 1}, 3)
+ kwargs = {}
+ callargs = funcutils.getcallargs(self._test_func, *args, **kwargs)
+
+ #implicit self counts as an arg
+ self.assertEqual(4, len(callargs))
+ self.assertTrue('instance' in callargs)
+ self.assertEqual({'uuid': 1}, callargs['instance'])
+ self.assertTrue('red' in callargs)
+ self.assertEqual(3, callargs['red'])
+ self.assertTrue('blue' in callargs)
+ self.assertEqual(None, callargs['blue'])
+
+ def test_partial_mixed_args(self):
+ args = (3,)
+ kwargs = {'instance': {'uuid': 1}}
+ callargs = funcutils.getcallargs(self._test_func, *args, **kwargs)
+
+ self.assertEqual(4, len(callargs))
+ self.assertTrue('instance' in callargs)
+ self.assertEqual({'uuid': 1}, callargs['instance'])
+ self.assertTrue('red' in callargs)
+ self.assertEqual(3, callargs['red'])
+ self.assertTrue('blue' in callargs)
+ self.assertEqual(None, callargs['blue'])
+
+ def _wrapper(self, function):
+
+ @functools.wraps(function)
+ def decorated_function(self, *args, **kwargs):
+ function(self, *args, **kwargs)
+
+ return decorated_function
+
+ def test_wrapped_X(self):
+
+ def wrapped(self, instance, red=None, blue=None):
+ pass
+
+ old_wrapped = wrapped
+
+ # Wrap it many times and ensure that its still the right one.
+ for _i in range(0, 10):
+ wrapped = self._wrapper(wrapped)
+ func = funcutils.get_wrapped_function(wrapped)
+ func_code = func.func_code
+ self.assertEqual(4, len(func_code.co_varnames))
+ self.assertTrue('self' in func_code.co_varnames)
+ self.assertTrue('instance' in func_code.co_varnames)
+ self.assertTrue('red' in func_code.co_varnames)
+ self.assertTrue('blue' in func_code.co_varnames)
+ self.assertEqual(old_wrapped, func)