summaryrefslogtreecommitdiff
path: root/src/zope/security/tests/test_proxy.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/zope/security/tests/test_proxy.py')
-rw-r--r--src/zope/security/tests/test_proxy.py376
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):