############################################################################## # # Copyright (c) 2001, 2002, 2003, 2012 Zope Foundation and Contributors. # All Rights Reserved. # # This software is subject to the provisions of the Zope Public License, # Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS # FOR A PARTICULAR PURPOSE. # ############################################################################## """Directives Tests """ import io import unittest def configfile(s): return io.StringIO(""" %s """ % s) class TestClassDirective(unittest.TestCase): def setUp(self): from zope.security.tests.exampleclass import ExampleClass try: del ExampleClass.__implements__ except AttributeError: pass from zope.component.testing import setUp setUp() def tearDown(self): from zope.security.tests.exampleclass import ExampleClass try: del ExampleClass.__implements__ except AttributeError: pass from zope.component.testing import tearDown tearDown() def _meta(self): from zope.configuration.xmlconfig import XMLConfig import zope.security XMLConfig('meta.zcml', zope.security)() def testEmptyDirective(self): from zope.configuration.xmlconfig import xmlconfig self._meta() f = configfile(""" """) xmlconfig(f) def testImplements(self): from zope.component.interface import queryInterface from zope.configuration.xmlconfig import xmlconfig from zope.security.tests.exampleclass import ExampleClass from zope.security.tests.exampleclass import IExample self._meta() self.assertEqual(queryInterface( "zope.security.tests.exampleclass.IExample"), None) f = configfile(""" """) xmlconfig(f) self.assertTrue(IExample.implementedBy(ExampleClass)) self.assertEqual(queryInterface( "zope.security.tests.exampleclass.IExample"), IExample) def testMulImplements(self): from zope.component.interface import queryInterface from zope.configuration.xmlconfig import xmlconfig from zope.security.tests.exampleclass import ExampleClass from zope.security.tests.exampleclass import IExample from zope.security.tests.exampleclass import IExample2 self._meta() self.assertEqual(queryInterface( "zope.security.tests.exampleclass.IExample"), None) self.assertEqual(queryInterface( "zope.security.tests.exampleclass.IExample2"), None) f = configfile(""" """) xmlconfig(f) self.assertTrue(IExample.implementedBy(ExampleClass)) self.assertTrue(IExample2.implementedBy(ExampleClass)) self.assertEqual(queryInterface( "zope.security.tests.exampleclass.IExample"), IExample) self.assertEqual(queryInterface( "zope.security.tests.exampleclass.IExample2"), IExample2) def testRequire(self): from zope.configuration.xmlconfig import xmlconfig self._meta() f = configfile(""" """) xmlconfig(f) def testAllow(self): from zope.configuration.xmlconfig import xmlconfig self._meta() f = configfile(""" """) xmlconfig(f) def testMimic(self): from zope.configuration.xmlconfig import xmlconfig self._meta() f = configfile(""" """) xmlconfig(f) class TestFactorySubdirective(unittest.TestCase): def setUp(self): from zope.component.testing import setUp setUp() def tearDown(self): from zope.component.testing import tearDown tearDown() def _meta(self): from zope.configuration.xmlconfig import XMLConfig import zope.security XMLConfig('meta.zcml', zope.security)() def testFactory(self): from zope.component import getUtility from zope.component.interfaces import IFactory from zope.configuration.xmlconfig import xmlconfig self._meta() f = configfile(""" """) xmlconfig(f) factory = getUtility(IFactory, 'test.Example') self.assertEqual(factory.title, "Example content") self.assertEqual(factory.description, "Example description") def testFactoryNoId(self): from zope.component import getUtility from zope.component.interfaces import IFactory from zope.configuration.xmlconfig import xmlconfig from zope.interface.interfaces import ComponentLookupError self._meta() f = configfile(""" """) xmlconfig(f) self.assertRaises(ComponentLookupError, getUtility, IFactory, 'Example') factory = getUtility( IFactory, 'zope.security.tests.exampleclass.ExampleClass') self.assertEqual(factory.title, "Example content") self.assertEqual(factory.description, "Example description") def testFactoryPublicPermission(self): from zope.component import getUtility from zope.component.interfaces import IFactory from zope.configuration.xmlconfig import xmlconfig self._meta() f = configfile(""" """) xmlconfig(f) factory = getUtility(IFactory, 'test.Example') self.assertTrue(hasattr(factory, '__Security_checker__')) template = """ %s """ class TestFactoryDirective(unittest.TestCase): def setUp(self): from zope.component.testing import setUp setUp() def tearDown(self): from zope.component.testing import tearDown tearDown() def meta(self): from zope.configuration.xmlconfig import XMLConfig import zope.security XMLConfig('meta.zcml', zope.security)() def testFactory(self): from zope.component import createObject from zope.configuration.xmlconfig import xmlconfig from zope.security import proxy from zope.security.tests import exampleclass self.meta() f = configfile(''' ''') xmlconfig(f) obj = createObject('test.Example') self.assertTrue(proxy.isinstance(obj, exampleclass.ExampleClass)) def _pfx(name): from zope.security.tests import module return module.__name__ + '.' + name def defineDirectives(): from zope.configuration.xmlconfig import XMLConfig from zope.configuration.xmlconfig import xmlconfig import zope.security XMLConfig('meta.zcml', zope.security)() xmlconfig(io.StringIO(""" """)) NOTSET = () P1 = "zope.Extravagant" P2 = "zope.Paltry" class TestRequireDirective(unittest.TestCase): def setUp(self): from zope.component.testing import setUp from zope.interface import implementer from zope.security.tests import module setUp() defineDirectives() class B: def m1(self): raise AssertionError("Never called") def m2(self): raise AssertionError("Never called") @implementer(module.I) class C(B): def m3(self): raise AssertionError("Never called") def m4(self): raise AssertionError("Never called") module.test_base = B module.test_class = C module.test_instance = C() self.assertState() def tearDown(self): from zope.security.tests import module module.test_class = None from zope.component.testing import tearDown tearDown() def assertState(self, m1P=NOTSET, m2P=NOTSET, m3P=NOTSET): # Verify that class, instance, and methods have expected permissions from zope.security.checker import selectChecker from zope.security.tests import module checker = selectChecker(module.test_instance) self.assertEqual(checker.permission_id('m1'), (m1P or None)) self.assertEqual(checker.permission_id('m2'), (m2P or None)) self.assertEqual(checker.permission_id('m3'), (m3P or None)) def assertDeclaration(self, declaration, **state): from zope.security.tests import module apply_declaration(module.template_bracket % declaration) self.assertState(**state) # "testSimple*" exercises tags that do NOT have children. This mode # inherently sets the instances as well as the class attributes. def test_wo_any_attributes(self): from zope.configuration.exceptions import ConfigurationError from zope.security.tests import module declaration = (''' ''' % (_pfx("test_class"), P1)) self.assertRaises(ConfigurationError, apply_declaration, module.template_bracket % declaration) # "testSimple*" exercises tags that do NOT have children. This mode # inherently sets the instances as well as the class attributes. def testSimpleMethodsPlural(self): declaration = (''' ''' % (_pfx("test_class"), P1)) self.assertDeclaration(declaration, m1P=P1, m3P=P1) def test_set_attributes(self): from zope.security.checker import selectChecker from zope.security.tests import module declaration = (''' ''' % (_pfx("test_class"), P1)) apply_declaration(module.template_bracket % declaration) checker = selectChecker(module.test_instance) self.assertEqual(checker.setattr_permission_id('m1'), P1) self.assertEqual(checker.setattr_permission_id('m2'), None) self.assertEqual(checker.setattr_permission_id('m3'), P1) def test_set_schema(self): from zope.component.interface import queryInterface from zope.security.checker import selectChecker from zope.security.tests import module self.assertEqual(queryInterface(_pfx("S")), None) declaration = (''' ''' % (_pfx("test_class"), P1, _pfx("S"))) apply_declaration(module.template_bracket % declaration) self.assertEqual(queryInterface(_pfx("S")), module.S) checker = selectChecker(module.test_instance) self.assertEqual(checker.setattr_permission_id('m1'), None) self.assertEqual(checker.setattr_permission_id('m2'), None) self.assertEqual(checker.setattr_permission_id('m3'), None) self.assertEqual(checker.setattr_permission_id('foo'), P1) self.assertEqual(checker.setattr_permission_id('bar'), P1) self.assertEqual(checker.setattr_permission_id('baro'), None) def test_multiple_set_schema(self): from zope.component.interface import queryInterface from zope.security.checker import selectChecker from zope.security.tests import module self.assertEqual(queryInterface(_pfx("S")), None) self.assertEqual(queryInterface(_pfx("S2")), None) declaration = (''' ''' % (_pfx("test_class"), P1, _pfx("S"), _pfx("S2"))) apply_declaration(module.template_bracket % declaration) self.assertEqual(queryInterface(_pfx("S")), module.S) self.assertEqual(queryInterface(_pfx("S2")), module.S2) checker = selectChecker(module.test_instance) self.assertEqual(checker.setattr_permission_id('m1'), None) self.assertEqual(checker.setattr_permission_id('m2'), None) self.assertEqual(checker.setattr_permission_id('m3'), None) self.assertEqual(checker.setattr_permission_id('foo'), P1) self.assertEqual(checker.setattr_permission_id('bar'), P1) self.assertEqual(checker.setattr_permission_id('foo2'), P1) self.assertEqual(checker.setattr_permission_id('bar2'), P1) self.assertEqual(checker.setattr_permission_id('baro'), None) def testSimpleInterface(self): from zope.component.interface import queryInterface from zope.security.tests import module self.assertEqual(queryInterface(_pfx("I")), None) declaration = (''' ''' % (_pfx("test_class"), P1, _pfx("I"))) # m1 and m2 are in the interface, so should be set, and m3 should not: self.assertDeclaration(declaration, m1P=P1, m2P=P1) # Make sure we know about the interfaces self.assertEqual(queryInterface(_pfx("I")), module.I) def testMultipleInterface(self): from zope.component.interface import queryInterface from zope.security.tests import module self.assertEqual(queryInterface(_pfx("I3")), None) self.assertEqual(queryInterface(_pfx("I4")), None) declaration = (''' ''' % (_pfx("test_class"), P1, _pfx("I3"), _pfx("I4"))) self.assertDeclaration(declaration, m3P=P1, m2P=P1) # Make sure we know about the interfaces self.assertEqual(queryInterface(_pfx("I3")), module.I3) self.assertEqual(queryInterface(_pfx("I4")), module.I4) # "testComposite*" exercises tags that DO have children. # "testComposite*TopPerm" exercises tags with permission in containing tag. # "testComposite*ElementPerm" exercises tags w/permission in children. def testCompositeNoPerm(self): # Establish rejection of declarations lacking a permission spec. from zope.configuration.exceptions import ConfigurationError declaration = (''' ''' % (_pfx("test_class"))) with self.assertRaises(ConfigurationError): self.assertDeclaration(declaration) def testCompositeMethodsPluralElementPerm(self): declaration = (''' ''' % (_pfx("test_class"), P1)) self.assertDeclaration(declaration, m1P=P1, m3P=P1) def testCompositeInterfaceTopPerm(self): declaration = (''' ''' % (_pfx("test_class"), P1, _pfx("I"))) self.assertDeclaration(declaration, m1P=P1, m2P=P1) def testSubInterfaces(self): declaration = (''' ''' % (_pfx("test_class"), P1, _pfx("I2"))) # m1 and m2 are in the interface, so should be set, and m3 should not: self.assertDeclaration(declaration, m1P=P1, m2P=P1) def testMimicOnly(self): declaration = (''' '''.format(_pfx("test_base"), P1, _pfx("test_class"), _pfx("test_base"))) # m1 and m2 are in the interface, so should be set, and m3 should not: self.assertDeclaration(declaration, m1P=P1, m2P=P1) def testMimicAsDefault(self): declaration = ( ''' '''.format( _pfx("test_base"), P1, _pfx("test_class"), _pfx("test_base"), P2)) # m1 and m2 are in the interface, so should be set, and m3 should not: self.assertDeclaration(declaration, m1P=P1, m2P=P2, m3P=P2) def apply_declaration(declaration): '''Apply the xmlconfig machinery.''' from zope.configuration.xmlconfig import xmlconfig return xmlconfig(io.StringIO(declaration)) def make_dummy(): from zope.interface import Interface import zope.security.zcml global IDummy class IDummy(Interface): perm = zope.security.zcml.Permission(title='') perms = [] def dummy(context_, perm): global perms perms.append(perm) class DirectivesTest(unittest.TestCase): def setUp(self): from zope.component.testing import setUp setUp() def tearDown(self): del perms[:] from zope.component.testing import tearDown tearDown() def testRedefinePermission(self): from zope.configuration import xmlconfig from zope.security import tests make_dummy() xmlconfig.file("redefineperms.zcml", tests) self.assertEqual(perms, ['zope.Security']) def test_suite(): return unittest.defaultTestLoader.loadTestsFromName(__name__)