From b7edc999729bc59a2a3abe7efbb5dbbccfa05c99 Mon Sep 17 00:00:00 2001 From: Victor Sergeyev Date: Thu, 1 Aug 2013 15:56:14 +0300 Subject: Fix missing argument bug in oslo common policy AndCheck() and OrCheck() classes in common policy module missing a argument when calls rules in __call__() method. Current patch fixed it by adding the necessary argument. Tests added. Fixed bug 1194354 Change-Id: I9a6e7d04b06ef61216cb7dbfd291c855b799b621 --- openstack/common/policy.py | 4 ++-- tests/unit/test_policy.py | 52 +++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 49 insertions(+), 7 deletions(-) diff --git a/openstack/common/policy.py b/openstack/common/policy.py index 02335ca..3a3c63f 100644 --- a/openstack/common/policy.py +++ b/openstack/common/policy.py @@ -404,7 +404,7 @@ class AndCheck(BaseCheck): """ for rule in self.rules: - if not rule(target, cred): + if not rule(target, cred, enforcer): return False return True @@ -447,7 +447,7 @@ class OrCheck(BaseCheck): """ for rule in self.rules: - if rule(target, cred): + if rule(target, cred, enforcer): return True return False diff --git a/tests/unit/test_policy.py b/tests/unit/test_policy.py index 2ccf71e..bd412bf 100644 --- a/tests/unit/test_policy.py +++ b/tests/unit/test_policy.py @@ -327,6 +327,48 @@ class NotCheckTestCase(utils.BaseTestCase): rule.assert_called_once_with('target', 'cred', None) +class AndCheckTestCase(utils.BaseTestCase): + def test_init(self): + check = policy.AndCheck(['rule1', 'rule2']) + + self.assertEqual(check.rules, ['rule1', 'rule2']) + + def test_add_check(self): + check = policy.AndCheck(['rule1', 'rule2']) + check.add_check('rule3') + + self.assertEqual(check.rules, ['rule1', 'rule2', 'rule3']) + + def test_str(self): + check = policy.AndCheck(['rule1', 'rule2']) + + self.assertEqual(str(check), '(rule1 and rule2)') + + def test_call_all_false(self): + rules = [mock.Mock(return_value=False), mock.Mock(return_value=False)] + check = policy.AndCheck(rules) + + self.assertEqual(check('target', 'cred', None), False) + rules[0].assert_called_once_with('target', 'cred', None) + self.assertFalse(rules[1].called) + + def test_call_first_true(self): + rules = [mock.Mock(return_value=True), mock.Mock(return_value=False)] + check = policy.AndCheck(rules) + + self.assertFalse(check('target', 'cred', None)) + rules[0].assert_called_once_with('target', 'cred', None) + rules[1].assert_called_once_with('target', 'cred', None) + + def test_call_second_true(self): + rules = [mock.Mock(return_value=False), mock.Mock(return_value=True)] + check = policy.AndCheck(rules) + + self.assertFalse(check('target', 'cred', None)) + rules[0].assert_called_once_with('target', 'cred', None) + self.assertFalse(rules[1].called) + + class OrCheckTestCase(utils.BaseTestCase): def test_init(self): check = policy.OrCheck(['rule1', 'rule2']) @@ -349,15 +391,15 @@ class OrCheckTestCase(utils.BaseTestCase): check = policy.OrCheck(rules) self.assertEqual(check('target', 'cred', None), False) - rules[0].assert_called_once_with('target', 'cred') - rules[1].assert_called_once_with('target', 'cred') + rules[0].assert_called_once_with('target', 'cred', None) + rules[1].assert_called_once_with('target', 'cred', None) def test_call_first_true(self): rules = [mock.Mock(return_value=True), mock.Mock(return_value=False)] check = policy.OrCheck(rules) self.assertEqual(check('target', 'cred', None), True) - rules[0].assert_called_once_with('target', 'cred') + rules[0].assert_called_once_with('target', 'cred', None) self.assertFalse(rules[1].called) def test_call_second_true(self): @@ -365,8 +407,8 @@ class OrCheckTestCase(utils.BaseTestCase): check = policy.OrCheck(rules) self.assertEqual(check('target', 'cred', None), True) - rules[0].assert_called_once_with('target', 'cred') - rules[1].assert_called_once_with('target', 'cred') + rules[0].assert_called_once_with('target', 'cred', None) + rules[1].assert_called_once_with('target', 'cred', None) class ParseCheckTestCase(utils.BaseTestCase): -- cgit