diff options
Diffstat (limited to 'src/zope/security/tests/test_proxy.py')
-rw-r--r-- | src/zope/security/tests/test_proxy.py | 376 |
1 files changed, 241 insertions, 135 deletions
diff --git a/src/zope/security/tests/test_proxy.py b/src/zope/security/tests/test_proxy.py index dd04d70..216b002 100644 --- a/src/zope/security/tests/test_proxy.py +++ b/src/zope/security/tests/test_proxy.py @@ -20,12 +20,9 @@ from zope.security._compat import PYTHON2, PURE_PYTHON def _skip_if_not_Py2(testfunc): return unittest.skipUnless(PYTHON2, "Only on Py2")(testfunc) -def _skip_if_Py2(testfunc): - return unittest.skipIf(PYTHON2, "Only on Py3")(testfunc) - # pylint:disable=protected-access,eval-used,too-many-lines,too-many-public-methods -if not PYTHON2: +if not PYTHON2: # pragma: no cover (Python 3) def coerce(*args): raise NotImplementedError("Not on Python 3") cmp = coerce @@ -35,11 +32,20 @@ class AbstractProxyTestBase(object): # pylint:disable=no-member,blacklisted-name + # The names of attributes that are spelled different on Py2 + # vs Py3 + itruediv = '__itruediv__' if not PYTHON2 else '__idiv__' + idiv = itruediv + div = '__truediv__' if not PYTHON2 else '__div__' + truediv = div + getslice = '__getitem__' if not PYTHON2 else '__getslice__' + setslice = '__setitem__' if not PYTHON2 else '__setslice__' + def _getTargetClass(self): raise NotImplementedError("Subclass responsibility") - def _makeOne(self, object, checker): - return self._getTargetClass()(object, checker) + def _makeOne(self, obj, checker): + return self._getTargetClass()(obj, checker) def test_ctor_w_checker_None(self): self.assertRaises(ValueError, self._makeOne, object(), None) @@ -51,6 +57,7 @@ class AbstractProxyTestBase(object): checker = DummyChecker() proxy = self._makeOne(target, checker) self.assertEqual(proxy.bar, 'Bar') + self.assertEqual(getattr(proxy, 'bar'), 'Bar') self.assertEqual(checker._checked, 'bar') self.assertEqual(checker._proxied, 'Bar') @@ -71,9 +78,29 @@ class AbstractProxyTestBase(object): target = Foo() checker = DummyChecker(ForbiddenAttribute) proxy = self._makeOne(target, checker) - self.assertRaises(ForbiddenAttribute, getattr, proxy, 'bar') + + with self.assertRaises(ForbiddenAttribute): + getattr(proxy, 'bar') self.assertEqual(checker._checked, 'bar') + def test__getattr__w_checker_ok_dynamic_attribute_called_once(self): + class Dynamic(object): + count = 0 + def __getattr__(self, name): + self.count += 1 + if self.count == 1: + # Called from __getattribute__ + raise AttributeError(name) + raise AssertionError("We should not be called more than once") + + target = Dynamic() + checker = DummyChecker() + proxy = self._makeOne(target, checker) + + with self.assertRaisesRegexp(AttributeError, "name"): + getattr(proxy, 'name') + self.assertEqual(1, target.count) + def test___setattr___w_checker_ok(self): class Foo(object): bar = 'Bar' @@ -274,6 +301,30 @@ class AbstractProxyTestBase(object): o_proxy = self._makeOne(target, checker) self.assertEqual(cmp(proxy, o_proxy), 0) + def test__le__(self): + target = 1 + checker = object() # checker not consulted + proxy = self._makeOne(target, checker) + self.assertTrue(proxy <= 1) + + def test__ne__(self): + target = 1 + checker = object() # checker not consulted + proxy = self._makeOne(target, checker) + self.assertFalse(proxy != 1) + + def test__ge__(self): + target = 1 + checker = object() # checker not consulted + proxy = self._makeOne(target, checker) + self.assertTrue(proxy >= 1) + + def test__gt__(self): + target = 1 + checker = object() # checker not consulted + proxy = self._makeOne(target, checker) + self.assertTrue(proxy > 0) + def test___hash___w_self(self): target = object() checker = object() # checker not consulted @@ -295,7 +346,7 @@ class AbstractProxyTestBase(object): from zope.security.interfaces import Unauthorized class Foo(object): def __call__(self): - return 'Bar' + raise AssertionError("Never called") target = Foo() checker = DummyChecker(Unauthorized, ['__name__', '__str__']) proxy = self._makeOne(target, checker) @@ -306,7 +357,7 @@ class AbstractProxyTestBase(object): from zope.security.interfaces import ForbiddenAttribute class Foo(object): def __call__(self): - return 'Bar' + raise AssertionError("Never called") target = Foo() checker = DummyChecker(ForbiddenAttribute, ['__str__']) proxy = self._makeOne(target, checker) @@ -439,39 +490,35 @@ class AbstractProxyTestBase(object): self.assertRaises(ForbiddenAttribute, lambda: proxy * 2) self.assertEqual(checker._checked, '__mul__') - @_skip_if_not_Py2 def test___div___w_checker_allows(self): target = 3 checker = DummyChecker() proxy = self._makeOne(target, checker) self.assertEqual(proxy / 2, target / 2) - self.assertEqual(checker._checked, '__div__') + self.assertEqual(checker._checked, self.div) - @_skip_if_not_Py2 def test___div___w_checker_forbids(self): from zope.security.interfaces import ForbiddenAttribute target = 3 checker = DummyChecker(ForbiddenAttribute) proxy = self._makeOne(target, checker) self.assertRaises(ForbiddenAttribute, lambda: proxy / 2) - self.assertEqual(checker._checked, '__div__') + self.assertEqual(checker._checked, self.div) - @_skip_if_Py2 def test___truediv___w_checker_allows(self): target = 3.0 checker = DummyChecker() proxy = self._makeOne(target, checker) self.assertEqual(proxy / 2, target / 2) - self.assertEqual(checker._checked, '__truediv__') + self.assertEqual(checker._checked, self.truediv) - @_skip_if_Py2 def test___truediv___w_checker_forbids(self): from zope.security.interfaces import ForbiddenAttribute target = 3.0 checker = DummyChecker(ForbiddenAttribute) proxy = self._makeOne(target, checker) self.assertRaises(ForbiddenAttribute, lambda: proxy / 2) - self.assertEqual(checker._checked, '__truediv__') + self.assertEqual(checker._checked, self.truediv) def test___floordiv___w_checker_allows(self): target = 3 @@ -726,7 +773,7 @@ class AbstractProxyTestBase(object): checker = DummyChecker() proxy = before = self._makeOne(target, checker) proxy += 3 - self.assertFalse(proxy is before) + self.assertIsNot(proxy, before) self.assertEqual(proxy, 6) self.assertEqual(checker._checked, '__iadd__') @@ -741,7 +788,7 @@ class AbstractProxyTestBase(object): checker = DummyChecker() proxy = before = self._makeOne(target, checker) proxy += 3 - self.assertTrue(proxy is before) + self.assertIs(proxy, before) self.assertEqual(target.value, 6) self.assertEqual(checker._checked, '__iadd__') @@ -750,12 +797,8 @@ class AbstractProxyTestBase(object): target = 3 checker = DummyChecker(ForbiddenAttribute) proxy = self._makeOne(target, checker) - try: + with self.assertRaises(ForbiddenAttribute): proxy += 3 - except ForbiddenAttribute: - pass - else: - self.fail() self.assertEqual(checker._checked, '__iadd__') def test___isub___not_inplace_checker_allows(self): @@ -763,7 +806,7 @@ class AbstractProxyTestBase(object): checker = DummyChecker() proxy = before = self._makeOne(target, checker) proxy -= 3 - self.assertFalse(proxy is before) + self.assertIsNot(proxy, before) self.assertEqual(proxy, 0) self.assertEqual(checker._checked, '__isub__') @@ -778,7 +821,7 @@ class AbstractProxyTestBase(object): checker = DummyChecker() proxy = before = self._makeOne(target, checker) proxy -= 3 - self.assertTrue(proxy is before) + self.assertIs(proxy, before) self.assertEqual(target.value, 0) self.assertEqual(checker._checked, '__isub__') @@ -787,12 +830,8 @@ class AbstractProxyTestBase(object): target = 3 checker = DummyChecker(ForbiddenAttribute) proxy = self._makeOne(target, checker) - try: + with self.assertRaises(ForbiddenAttribute): proxy -= 3 - except ForbiddenAttribute: - pass - else: - self.fail() self.assertEqual(checker._checked, '__isub__') def test___imul___not_inplace_checker_allows(self): @@ -800,7 +839,7 @@ class AbstractProxyTestBase(object): checker = DummyChecker() proxy = before = self._makeOne(target, checker) proxy *= 3 - self.assertFalse(proxy is before) + self.assertIsNot(proxy, before) self.assertEqual(proxy, 9) self.assertEqual(checker._checked, '__imul__') @@ -815,7 +854,7 @@ class AbstractProxyTestBase(object): checker = DummyChecker() proxy = before = self._makeOne(target, checker) proxy *= 3 - self.assertTrue(proxy is before) + self.assertIs(proxy, before) self.assertEqual(target.value, 9) self.assertEqual(checker._checked, '__imul__') @@ -824,25 +863,19 @@ class AbstractProxyTestBase(object): target = 3 checker = DummyChecker(ForbiddenAttribute) proxy = self._makeOne(target, checker) - try: + with self.assertRaises(ForbiddenAttribute): proxy *= 3 - except ForbiddenAttribute: - pass - else: - self.fail() self.assertEqual(checker._checked, '__imul__') - @_skip_if_not_Py2 def test___idiv___not_inplace_checker_allows(self): target = 6 checker = DummyChecker() proxy = before = self._makeOne(target, checker) proxy /= 3 - self.assertFalse(proxy is before) + self.assertIsNot(proxy, before) self.assertEqual(proxy, 2) - self.assertEqual(checker._checked, '__idiv__') + self.assertEqual(checker._checked, self.idiv) - @_skip_if_not_Py2 def test___idiv___inplace_checker_allows(self): class Foo(object): def __init__(self, value): @@ -850,39 +883,33 @@ class AbstractProxyTestBase(object): def __idiv__(self, rhs): self.value /= rhs return self + __itruediv__ = __idiv__ target = Foo(6) checker = DummyChecker() proxy = before = self._makeOne(target, checker) proxy /= 3 - self.assertTrue(proxy is before) + self.assertIs(proxy, before) self.assertEqual(target.value, 2) - self.assertEqual(checker._checked, '__idiv__') + self.assertEqual(checker._checked, self.idiv) - @_skip_if_not_Py2 def test___idiv___w_checker_forbids(self): from zope.security.interfaces import ForbiddenAttribute target = 6 checker = DummyChecker(ForbiddenAttribute) proxy = self._makeOne(target, checker) - try: + with self.assertRaises(ForbiddenAttribute): proxy /= 3 - except ForbiddenAttribute: - pass - else: - self.fail() - self.assertEqual(checker._checked, '__idiv__') + self.assertEqual(checker._checked, self.idiv) - @_skip_if_Py2 def test___itruediv___not_inplace_checker_allows(self): target = 6 checker = DummyChecker() proxy = before = self._makeOne(target, checker) proxy /= 3 - self.assertFalse(proxy is before) + self.assertIsNot(proxy, before) self.assertEqual(proxy, 2) - self.assertEqual(checker._checked, '__itruediv__') + self.assertEqual(checker._checked, self.itruediv) - @_skip_if_Py2 def test___itruediv___inplace_checker_allows(self): class Foo(object): def __init__(self, value): @@ -890,34 +917,30 @@ class AbstractProxyTestBase(object): def __itruediv__(self, rhs): self.value /= rhs return self + __idiv__ = __itruediv__ target = Foo(6) checker = DummyChecker() proxy = before = self._makeOne(target, checker) proxy /= 3 - self.assertTrue(proxy is before) + self.assertIs(proxy, before) self.assertEqual(target.value, 2) - self.assertEqual(checker._checked, '__itruediv__') + self.assertEqual(checker._checked, self.itruediv) - @_skip_if_Py2 def test___itruediv___w_checker_forbids(self): from zope.security.interfaces import ForbiddenAttribute target = 6 checker = DummyChecker(ForbiddenAttribute) proxy = self._makeOne(target, checker) - try: + with self.assertRaises(ForbiddenAttribute): proxy /= 3 - except ForbiddenAttribute: - pass - else: - self.fail() - self.assertEqual(checker._checked, '__itruediv__') + self.assertEqual(checker._checked, self.itruediv) def test___ifloordiv___not_inplace_checker_allows(self): target = 6 checker = DummyChecker() proxy = before = self._makeOne(target, checker) proxy //= 3 - self.assertFalse(proxy is before) + self.assertIsNot(proxy, before) self.assertEqual(proxy, 2) self.assertEqual(checker._checked, '__ifloordiv__') @@ -932,7 +955,7 @@ class AbstractProxyTestBase(object): checker = DummyChecker() proxy = before = self._makeOne(target, checker) proxy //= 3 - self.assertTrue(proxy is before) + self.assertIs(proxy, before) self.assertEqual(target.value, 2) self.assertEqual(checker._checked, '__ifloordiv__') @@ -941,12 +964,8 @@ class AbstractProxyTestBase(object): target = 6 checker = DummyChecker(ForbiddenAttribute) proxy = self._makeOne(target, checker) - try: + with self.assertRaises(ForbiddenAttribute): proxy //= 3 - except ForbiddenAttribute: - pass - else: - self.fail() self.assertEqual(checker._checked, '__ifloordiv__') def test___imod___not_inplace_checker_allows(self): @@ -954,7 +973,7 @@ class AbstractProxyTestBase(object): checker = DummyChecker() proxy = before = self._makeOne(target, checker) proxy %= 3 - self.assertFalse(proxy is before) + self.assertIsNot(proxy, before) self.assertEqual(proxy, 0) self.assertEqual(checker._checked, '__imod__') @@ -969,7 +988,7 @@ class AbstractProxyTestBase(object): checker = DummyChecker() proxy = before = self._makeOne(target, checker) proxy %= 3 - self.assertTrue(proxy is before) + self.assertIs(proxy, before) self.assertEqual(target.value, 0) self.assertEqual(checker._checked, '__imod__') @@ -978,12 +997,8 @@ class AbstractProxyTestBase(object): target = 6 checker = DummyChecker(ForbiddenAttribute) proxy = self._makeOne(target, checker) - try: + with self.assertRaises(ForbiddenAttribute): proxy %= 3 - except ForbiddenAttribute: - pass - else: - self.fail() self.assertEqual(checker._checked, '__imod__') def test___ipow___not_inplace_checker_allows(self): @@ -991,7 +1006,7 @@ class AbstractProxyTestBase(object): checker = DummyChecker() proxy = before = self._makeOne(target, checker) proxy **= 3 - self.assertFalse(proxy is before) + self.assertIsNot(proxy, before) self.assertEqual(proxy, 8) self.assertEqual(checker._checked, '__ipow__') @@ -1006,7 +1021,7 @@ class AbstractProxyTestBase(object): checker = DummyChecker() proxy = before = self._makeOne(target, checker) proxy **= 3 - self.assertTrue(proxy is before) + self.assertIs(proxy, before) self.assertEqual(target.value, 8) self.assertEqual(checker._checked, '__ipow__') @@ -1015,12 +1030,8 @@ class AbstractProxyTestBase(object): target = 2 checker = DummyChecker(ForbiddenAttribute) proxy = self._makeOne(target, checker) - try: + with self.assertRaises(ForbiddenAttribute): proxy **= 3 - except ForbiddenAttribute: - pass - else: - self.fail() self.assertEqual(checker._checked, '__ipow__') def test___ilshift___not_inplace_checker_allows(self): @@ -1028,7 +1039,7 @@ class AbstractProxyTestBase(object): checker = DummyChecker() proxy = before = self._makeOne(target, checker) proxy <<= 3 - self.assertFalse(proxy is before) + self.assertIsNot(proxy, before) self.assertEqual(proxy, 16) self.assertEqual(checker._checked, '__ilshift__') @@ -1043,7 +1054,7 @@ class AbstractProxyTestBase(object): checker = DummyChecker() proxy = before = self._makeOne(target, checker) proxy <<= 3 - self.assertTrue(proxy is before) + self.assertIs(proxy, before) self.assertEqual(target.value, 16) self.assertEqual(checker._checked, '__ilshift__') @@ -1052,12 +1063,8 @@ class AbstractProxyTestBase(object): target = 2 checker = DummyChecker(ForbiddenAttribute) proxy = self._makeOne(target, checker) - try: + with self.assertRaises(ForbiddenAttribute): proxy <<= 3 - except ForbiddenAttribute: - pass - else: - self.fail() self.assertEqual(checker._checked, '__ilshift__') def test___irshift___not_inplace_checker_allows(self): @@ -1065,7 +1072,7 @@ class AbstractProxyTestBase(object): checker = DummyChecker() proxy = before = self._makeOne(target, checker) proxy >>= 3 - self.assertFalse(proxy is before) + self.assertIsNot(proxy, before) self.assertEqual(proxy, 2) self.assertEqual(checker._checked, '__irshift__') @@ -1080,7 +1087,7 @@ class AbstractProxyTestBase(object): checker = DummyChecker() proxy = before = self._makeOne(target, checker) proxy >>= 3 - self.assertTrue(proxy is before) + self.assertIs(proxy, before) self.assertEqual(target.value, 2) self.assertEqual(checker._checked, '__irshift__') @@ -1089,12 +1096,8 @@ class AbstractProxyTestBase(object): target = 16 checker = DummyChecker(ForbiddenAttribute) proxy = self._makeOne(target, checker) - try: + with self.assertRaises(ForbiddenAttribute): proxy >>= 3 - except ForbiddenAttribute: - pass - else: - self.fail() self.assertEqual(checker._checked, '__irshift__') def test___iand___not_inplace_checker_allows(self): @@ -1102,7 +1105,7 @@ class AbstractProxyTestBase(object): checker = DummyChecker() proxy = before = self._makeOne(target, checker) proxy &= 3 - self.assertFalse(proxy is before) + self.assertIsNot(proxy, before) self.assertEqual(proxy, 3) self.assertEqual(checker._checked, '__iand__') @@ -1117,7 +1120,7 @@ class AbstractProxyTestBase(object): checker = DummyChecker() proxy = before = self._makeOne(target, checker) proxy &= 3 - self.assertTrue(proxy is before) + self.assertIs(proxy, before) self.assertEqual(target.value, 3) self.assertEqual(checker._checked, '__iand__') @@ -1126,12 +1129,8 @@ class AbstractProxyTestBase(object): target = 7 checker = DummyChecker(ForbiddenAttribute) proxy = self._makeOne(target, checker) - try: + with self.assertRaises(ForbiddenAttribute): proxy &= 3 - except ForbiddenAttribute: - pass - else: - self.fail() self.assertEqual(checker._checked, '__iand__') def test___ixor___not_inplace_checker_allows(self): @@ -1139,7 +1138,7 @@ class AbstractProxyTestBase(object): checker = DummyChecker() proxy = before = self._makeOne(target, checker) proxy ^= 3 - self.assertFalse(proxy is before) + self.assertIsNot(proxy, before) self.assertEqual(checker._checked, '__ixor__') self.assertEqual(proxy, 4) @@ -1154,7 +1153,7 @@ class AbstractProxyTestBase(object): checker = DummyChecker() proxy = before = self._makeOne(target, checker) proxy ^= 3 - self.assertTrue(proxy is before) + self.assertIs(proxy, before) self.assertEqual(target.value, 4) self.assertEqual(checker._checked, '__ixor__') @@ -1163,12 +1162,10 @@ class AbstractProxyTestBase(object): target = 7 checker = DummyChecker(ForbiddenAttribute) proxy = self._makeOne(target, checker) - try: + + with self.assertRaises(ForbiddenAttribute): proxy ^= 3 - except ForbiddenAttribute: - pass - else: - self.fail() + self.assertEqual(checker._checked, '__ixor__') def test___ior___not_inplace_checker_allows(self): @@ -1176,7 +1173,7 @@ class AbstractProxyTestBase(object): checker = DummyChecker() proxy = before = self._makeOne(target, checker) proxy |= 3 - self.assertFalse(proxy is before) + self.assertIsNot(proxy, before) self.assertEqual(proxy, 7) self.assertEqual(checker._checked, '__ior__') @@ -1191,7 +1188,7 @@ class AbstractProxyTestBase(object): checker = DummyChecker() proxy = before = self._makeOne(target, checker) proxy |= 3 - self.assertTrue(proxy is before) + self.assertIs(proxy, before) self.assertEqual(target.value, 7) self.assertEqual(checker._checked, '__ior__') @@ -1200,12 +1197,8 @@ class AbstractProxyTestBase(object): target = 6 checker = DummyChecker(ForbiddenAttribute) proxy = self._makeOne(target, checker) - try: + with self.assertRaises(ForbiddenAttribute): proxy |= 3 - except ForbiddenAttribute: - pass - else: - self.fail() self.assertEqual(checker._checked, '__ior__') def test___len___w_checker_allows(self): @@ -1223,6 +1216,20 @@ class AbstractProxyTestBase(object): self.assertRaises(ForbiddenAttribute, len, proxy) self.assertEqual(checker._checked, '__len__') + def test__length_hint_w_checker_allows(self): + target = iter([0, 1, 2]) + checker = DummyChecker() + proxy = self._makeOne(target, checker) + hint = object.__getattribute__(proxy, '__length_hint__') + self.assertEqual(3, hint()) + + def test__length_hint_dne(self): + target = object() + checker = DummyChecker() + proxy = self._makeOne(target, checker) + hint = object.__getattribute__(proxy, '__length_hint__') + self.assertEqual(NotImplemented, hint()) + def test___contains___hit_w_checker_allows(self): target = [0, 1, 2] checker = DummyChecker() @@ -1300,7 +1307,40 @@ class AbstractProxyTestBase(object): checker = DummyChecker() proxy = self._makeOne(target, checker) self.assertEqual(proxy[1:3], [1, 2]) - self.assertEqual(checker._checked, '__getslice__') + self.assertEqual(checker._checked, self.getslice) + + def test___getslice___error_propagates(self): + class Missing(Exception): + pass + class Get(object): + def __getitem__(self, x): + raise Missing('__getitem__') # pragma: no cover (only py3) + def __getslice__(self, start, stop): + raise Missing("__getslice__") + target = Get() + checker = DummyChecker() + proxy = self._makeOne(target, checker) + with self.assertRaisesRegexp(Missing, + self.getslice): + proxy[1:2] + + self.assertEqual(checker._checked, self.getslice) + + def test___getslice___dne_uses_getitem(self): + class Missing(Exception): + pass + class Get(object): + def __getitem__(self, x): + raise Missing('__getitem__') + + target = Get() + checker = DummyChecker() + proxy = self._makeOne(target, checker) + with self.assertRaisesRegexp(Missing, + '__getitem__'): + proxy[1:2] + + self.assertEqual(checker._checked, self.getslice) @_skip_if_not_Py2 def test___getslice___w_checker_forbids(self): @@ -1331,6 +1371,39 @@ class AbstractProxyTestBase(object): self.assertRaises(ForbiddenAttribute, _try) self.assertEqual(checker._checked, '__setslice__') + def test___setslice___error_propagates(self): + class Missing(Exception): + pass + class Set(object): + def __setitem__(self, k, v): + raise Missing('__setitem__') # pragma: no cover (only py3) + def __setslice__(self, start, stop, value): + raise Missing("__setslice__") + target = Set() + checker = DummyChecker() + proxy = self._makeOne(target, checker) + with self.assertRaisesRegexp(Missing, + self.setslice): + proxy[1:2] = 1 + + self.assertEqual(checker._checked, self.setslice) + + def test___setslice___dne_uses_setitem(self): + class Missing(Exception): + pass + class Set(object): + def __setitem__(self, k, v): + raise Missing('__setitem__') + + target = Set() + checker = DummyChecker() + proxy = self._makeOne(target, checker) + with self.assertRaisesRegexp(Missing, + '__setitem__'): + proxy[1:2] = 1 + + self.assertEqual(checker._checked, self.setslice) + def test___getitem___mapping_hit_w_checker_allows(self): target = {'a': 0, 'b': 1, 'c': 2} checker = DummyChecker() @@ -1416,14 +1489,24 @@ class ProxyPyTests(AbstractProxyTestBase, self.assertRaises(AttributeError, getattr, proxy, '_wrapped') self.assertRaises(AttributeError, getattr, proxy, '_checker') + def test_access_checker_from_subclass(self): + target = object() + checker = DummyChecker() + class Sub(self._getTargetClass()): + def get_checker(self): + return self._checker + + sub = Sub(target, checker) + self.assertIs(checker, sub.get_checker()) + def test_ctor_w_checker(self): from zope.security.proxy import getObjectPy, getCheckerPy # Can't access '_wrapped' / '_checker' in C version target = object() checker = object() proxy = self._makeOne(target, checker) - self.assertTrue(getObjectPy(proxy) is target) - self.assertTrue(getCheckerPy(proxy) is checker) + self.assertIs(getObjectPy(proxy), target) + self.assertIs(getCheckerPy(proxy), checker) def test___delattr___w__wrapped(self): target = object() @@ -1481,6 +1564,32 @@ class ProxyPyTests(AbstractProxyTestBase, finally: zope.security.proxy._builtin_isinstance = orig_builtin_isinstance + def test_getObjectPy_other_object(self): + # If it's not a proxy, return it + from zope.security.proxy import getObjectPy + self.assertIs(self, getObjectPy(self)) + + def test_get_reduce(self): + class Reduce(object): + def __reduce__(self): + return 1 + + def __reduce_ex__(self, prot): + return prot + + reduce_ = Reduce() + proxy = self._makeOne(reduce_, DummyChecker()) + self.assertEqual(1, proxy.__reduce__()) + self.assertEqual(2, proxy.__reduce_ex__(2)) + + def test__module__(self): + class WithModule(object): + __module__ = 'foo' + + module = WithModule() + proxy = self._makeOne(module, DummyChecker()) + self.assertEqual(WithModule.__module__, proxy.__module__) + class DummyChecker(object): _proxied = _checked = None def __init__(self, raising=None, allowed=()): @@ -1554,15 +1663,15 @@ class Checker(object): unproxied_types = {str,} - def check_getattr(self, object, name): + def check_getattr(self, _object, name): if name not in ("foo", "next", "__class__", "__name__", "__module__"): raise RuntimeError - def check_setattr(self, object, name): + def check_setattr(self, _object, name): if name != "foo": raise RuntimeError - def check(self, object, opname): + def check(self, _object, _opname): if not self.ok: raise RuntimeError @@ -1601,7 +1710,7 @@ class Something: return [42] def __setslice__(self, i, j, value): if value != [42]: - raise ValueError + raise AssertionError("Value should be [42]") def __contains__(self, x): return x == 42 @@ -1620,11 +1729,8 @@ class ProxyTests(unittest.TestCase): self.c.ok = 1 def testDerivation(self): - if PURE_PYTHON: - from zope.proxy import PyProxyBase as ProxyBase - else: - from zope.proxy import ProxyBase - self.assertTrue(isinstance(self.p, ProxyBase)) + from zope.proxy import ProxyBase + self.assertIsInstance(self.p, ProxyBase) def testStr(self): from zope.security.proxy import ProxyFactory @@ -1860,7 +1966,7 @@ class ProxyTests(unittest.TestCase): a = [1, 2, 3] pa = qa = P(a) pa += [4, 5, 6] - self.assertTrue(pa is qa) + self.assertIs(pa, qa) self.assertEqual(a, [1, 2, 3, 4, 5, 6]) def doit(): @@ -1872,10 +1978,10 @@ class ProxyTests(unittest.TestCase): pa **= 2 self.assertEqual(removeSecurityProxy(pa), 4) - def doit(): + def doit2(): pa = P(2) pa **= 2 - self.shouldFail(doit) + self.shouldFail(doit2) @_skip_if_not_Py2 def test_coerce(self): |