Ejemplo n.º 1
0
def notifyDel(self, item):
    if item.has_key(ORDER_SESSION_KEY):
        try:
            site = getSite()
            app = self
            while not isinstance(app, Application):
                app = aq_parent(app)
            instances = _findInstances(app)
            for instance in instances:
                try:
                    _setSite(instance)
                    registry = IOrderRegistry(instance)
                    registry.cancel(item.get(ORDER_SESSION_KEY))
                except:
                    pass
        except:
            pass
        finally:
            try:
                if not site.REQUEST._lazies.has_key("SESSION"):
                    # add a lazy callable to the request to prevent KeyError
                    # as we might have a recursive call to HTTPRequest.get
                    # which will remove the before available lazy SESSION
                    # ZPublisher.HTTPRequest[1333:1339]
                    site.REQUEST.set_lazy("SESSION", lambda: 1)
                _setSite(site)
            except:
                pass
    TransientObjectContainer.__old__notifyDel(self, item)
Ejemplo n.º 2
0
 def setUp(self):
     Products.Transience.Transience.time = fauxtime
     Products.Transience.TransientObject.time = fauxtime
     Products.Transience.Transience.setStrict(1)
     self.errmargin = .20
     self.timeout = 60
     self.t = TransientObjectContainer('sdc',
                                       timeout_mins=self.timeout / 60)
 def __init__(self,
              id='portal_captchas',
              title='',
              timeout_mins=60,
              addNotification=None,
              delNotification=None,
              limit=0,
              period_secs=60):
     TransientObjectContainer.__init__(self, id, title, timeout_mins,
                                       addNotification, delNotification,
                                       limit, period_secs)
 def setUp(self):
     Products.Transience.Transience.time = fauxtime
     Products.Transience.TransientObject.time = fauxtime
     Products.Transience.Transience.setStrict(1)
     self.errmargin = .20
     self.timeout = fauxtime.timeout
     self.t = TransientObjectContainer('sdc', timeout_mins=self.timeout/60)
 def testSubobjectLimitWorks(self):
     self.t = TransientObjectContainer(
         'a',
         timeout_mins=self.timeout // 60,
         limit=10,
     )
     self.assertRaises(MaxTransientObjectsExceeded, self._maxOut)
Ejemplo n.º 6
0
def _populate(app):
    bidmgr = BrowserIdManager(idmgr_name)
    tf = MountedTemporaryFolder(tf_name, 'Temporary Folder')
    toc = TransientObjectContainer(toc_name, title='Temporary '
        'Transient Object Container', timeout_mins=1)
    session_data_manager=SessionDataManager(id=sdm_name,
        path='/'+tf_name+'/'+toc_name, title='Session Data Manager')

    try: app._delObject(idmgr_name)
    except AttributeError: pass

    try: app._delObject(tf_name)
    except AttributeError: pass

    try: app._delObject(sdm_name)
    except AttributeError: pass

    app._setObject(idmgr_name, bidmgr)

    app._setObject(sdm_name, session_data_manager)

    app._setObject(tf_name, tf)
    transaction.commit()

    app.temp_folder._setObject(toc_name, toc)
    transaction.commit()
Ejemplo n.º 7
0
    def setUp(self):
        self._oldSkindata = Skinnable.SKINDATA.copy()
        transaction.begin()

        app = self.app = makerequest(Zope2.app())
        # Log in as a god :-)
        newSecurityManager(None, UnrestrictedUser('god', 'god', ['Manager'],
                                                  ''))

        factory = app.manage_addProduct['CMFDefault'].addConfiguredSite
        factory('CalendarTest',
                'CMFDefault:default',
                snapshot=False,
                extension_ids=('CMFCalendar:default', ))
        self.Site = app.CalendarTest
        self.Tool = app.CalendarTest.portal_calendar

        # sessioning setup
        if getattr(app, 'temp_folder', None) is None:
            temp_folder = MountedTemporaryFolder('temp_folder')
            app._setObject('temp_folder', temp_folder)
        if getattr(app.temp_folder, 'session_data', None) is None:
            session_data = TransientObjectContainer('session_data')
            app.temp_folder._setObject('session_data', session_data)
        app.REQUEST.set_lazy('SESSION',
                             app.session_data_manager.getSessionData)
Ejemplo n.º 8
0
    def setUp(self):
        self._trap_warning_output()
        transaction.begin()

        app = self.app = makerequest(Zope2.app())
        # Log in as a god :-)
        newSecurityManager(None, UnrestrictedUser('god', 'god', ['Manager'],
                                                  ''))

        app.manage_addProduct['CMFDefault'].manage_addCMFSite('CalendarTest')

        self.Site = app.CalendarTest

        manage_addExternalMethod(app.CalendarTest,
                                 id='install_events',
                                 title="Install Events",
                                 module="CMFCalendar.Install",
                                 function="install")

        ExMethod = app.restrictedTraverse('/CalendarTest/install_events')
        ExMethod()
        self.Tool = app.CalendarTest.portal_calendar

        self.Site.clearCurrentSkin()
        self.Site.setupCurrentSkin(app.REQUEST)

        # sessioning setup
        if getattr(app, 'temp_folder', None) is None:
            temp_folder = MountedTemporaryFolder('temp_folder')
            app._setObject('temp_folder', temp_folder)
        if getattr(app.temp_folder, 'session_data', None) is None:
            session_data = TransientObjectContainer('session_data')
            app.temp_folder._setObject('session_data', session_data)
        app.REQUEST.set_lazy('SESSION',
                             app.session_data_manager.getSessionData)
Ejemplo n.º 9
0
def setup_sdm(portal):
    """
    Setup session data manager.
    """
    tf_name = 'temp_folder'
    idmgr_name = 'browser_id_manager'
    toc_name = 'temp_transient_container'
    sdm_name = 'session_data_manager'

    from Products.Sessions.BrowserIdManager import BrowserIdManager
    from Products.Sessions.SessionDataManager import SessionDataManager
    from Products.TemporaryFolder.TemporaryFolder import MountedTemporaryFolder
    from Products.Transience.Transience import TransientObjectContainer

    import transaction

    bidmgr = BrowserIdManager(idmgr_name)
    tf = MountedTemporaryFolder(tf_name, title='Temporary Folder')
    toc = TransientObjectContainer(
        toc_name,
        title='Temporary Transient Object Container',
        timeout_mins=20,
    )
    session_data_manager = SessionDataManager(
        id=sdm_name,
        path=tf_name + '/' + toc_name,
        title='Session Data Manager',
        requestName='TESTOFSESSION',
    )
    portal._setObject(idmgr_name, bidmgr)
    portal._setObject(sdm_name, session_data_manager)
    portal._setObject(tf_name, tf)
    portal.temp_folder._setObject(toc_name, toc)
    transaction.commit()
    def setUp(self):
        Products.Transience.Transience.time = slowfauxtime
        Products.Transience.TransientObject.time = slowfauxtime
        Products.Transience.Transience.setStrict(1)

        self.errmargin = .20
        self.timeout = 120
        self.period = 20
        self.t = TransientObjectContainer(
            'sdc', timeout_mins=self.timeout // 60, period_secs=self.period)
Ejemplo n.º 11
0
 def setUp(self):
     Products.Transience.Transience.time = fauxtime
     Products.Transience.TransientObject.time = fauxtime
     Products.Transience.Transience.setStrict(1)
     self.app = makerequest.makerequest(_getApp())
     timeout = self.timeout = 1
     sm=TransientObjectContainer(
         id='sm', timeout_mins=timeout, title='SessionThing',
         addNotification=addNotificationTarget,
         delNotification=delNotificationTarget)
     self.app._setObject('sm', sm)
Ejemplo n.º 12
0
def _populate(app):
    from OFS.DTMLMethod import DTMLMethod
    from Products.Sessions.BrowserIdManager import BrowserIdManager
    from Products.Sessions.SessionDataManager import SessionDataManager
    from Products.TemporaryFolder.TemporaryFolder import MountedTemporaryFolder
    from Products.Transience.Transience import TransientObjectContainer
    import transaction
    bidmgr = BrowserIdManager(idmgr_name)
    tf = MountedTemporaryFolder(tf_name, title="Temporary Folder")
    toc = TransientObjectContainer(toc_name,
                                   title='Temporary '
                                   'Transient Object Container',
                                   timeout_mins=20)
    session_data_manager = SessionDataManager(id=sdm_name,
                                              path='/' + tf_name + '/' +
                                              toc_name,
                                              title='Session Data Manager',
                                              requestName='TESTOFSESSION')

    try:
        app._delObject(idmgr_name)
    except (AttributeError, KeyError):
        pass

    try:
        app._delObject(tf_name)
    except (AttributeError, KeyError):
        pass

    try:
        app._delObject(sdm_name)
    except (AttributeError, KeyError):
        pass

    try:
        app._delObject('index_html')
    except (AttributeError, KeyError):
        pass

    app._setObject(idmgr_name, bidmgr)

    app._setObject(sdm_name, session_data_manager)

    app._setObject(tf_name, tf)
    transaction.commit()

    app.temp_folder._setObject(toc_name, toc)
    transaction.commit()

    # index_html necessary for publishing emulation for testAutoReqPopulate
    app._setObject('index_html', DTMLMethod('', __name__='foo'))
    transaction.commit()
Ejemplo n.º 13
0
def setupCoreSessions(app):
    '''Sets up the session_data_manager e.a.'''
    commit = 0

    try:
        from Products.TemporaryFolder.TemporaryFolder import \
            MountedTemporaryFolder
        from Products.Transience.Transience import TransientObjectContainer
        from Products.Sessions.BrowserIdManager import BrowserIdManager
        from Products.Sessions.SessionDataManager import SessionDataManager
    except ImportError:
        pass
    else:
        if not hasattr(app, 'temp_folder'):
            tf = MountedTemporaryFolder('temp_folder', 'Temporary Folder')
            app._setObject('temp_folder', tf)
            commit = 1

        if not hasattr(aq_base(app.temp_folder), 'session_data'):
            toc = TransientObjectContainer('session_data',
                                           'Session Data Container',
                                           timeout_mins=3,
                                           limit=100)
            app.temp_folder._setObject('session_data', toc)
            commit = 1

        if not hasattr(app, 'browser_id_manager'):
            bid = BrowserIdManager('browser_id_manager', 'Browser Id Manager')
            app._setObject('browser_id_manager', bid)
            commit = 1

        if not hasattr(app, 'session_data_manager'):
            sdm = SessionDataManager('session_data_manager',
                                     title='Session Data Manager',
                                     path='/temp_folder/session_data',
                                     requestName='SESSION')
            app._setObject('session_data_manager', sdm)
            commit = 1

        if commit:
            transaction.commit()
Ejemplo n.º 14
0
def setupCoreSessions(app=None):
    '''Sets up the session_data_manager e.a.'''
    from Acquisition import aq_base
    commit = 0

    if app is None:
        return appcall(setupCoreSessions)

    if not hasattr(app, 'temp_folder'):
        from Products.TemporaryFolder.TemporaryFolder import MountedTemporaryFolder
        tf = MountedTemporaryFolder('temp_folder', 'Temporary Folder')
        app._setObject('temp_folder', tf)
        commit = 1

    if not hasattr(aq_base(app.temp_folder), 'session_data'):
        from Products.Transience.Transience import TransientObjectContainer
        toc = TransientObjectContainer('session_data',
                                       'Session Data Container',
                                       timeout_mins=3,
                                       limit=100)
        app.temp_folder._setObject('session_data', toc)
        commit = 1

    if not hasattr(app, 'browser_id_manager'):
        from Products.Sessions.BrowserIdManager import BrowserIdManager
        bid = BrowserIdManager('browser_id_manager', 'Browser Id Manager')
        app._setObject('browser_id_manager', bid)
        commit = 1

    if not hasattr(app, 'session_data_manager'):
        from Products.Sessions.SessionDataManager import SessionDataManager
        sdm = SessionDataManager('session_data_manager',
                                 title='Session Data Manager',
                                 path='/temp_folder/session_data',
                                 requestName='SESSION')
        app._setObject('session_data_manager', sdm)
        commit = 1

    if commit:
        transaction.commit()
Ejemplo n.º 15
0
 def __init__(self, id='portal_captchas', title='', timeout_mins=60, addNotification=None,
              delNotification=None, limit=0, period_secs=60):
     TransientObjectContainer.__init__(self, id, title, timeout_mins, addNotification,
                                       delNotification, limit, period_secs)
Ejemplo n.º 16
0
def install_tempfolder_and_sdc(app):
    from App.config import getConfiguration
    from Acquisition import aq_base
    from .MountedObject import manage_addMounts, MountedObject
    from .MountedObject import getConfiguration as getDBTabConfiguration

    dbtab_config = getDBTabConfiguration()

    tf = getattr(app, 'temp_folder', None)

    if getattr(tf, 'meta_type', None) == MountedObject.meta_type:
        # tf is a MountPoint object.  This means that the temp_folder
        # couldn't be mounted properly (the meta_type would have been
        # the meta type of the container class otherwise).  The
        # MountPoint object writes a message to zLOG so we don't
        # need to.
        return

    if tf is None:
        if dbtab_config is None:
            # DefaultConfiguration, do nothing
            return
        mount_paths = [ x[0] for x in dbtab_config.listMountPaths() ]
        if not '/temp_folder' in mount_paths:
            # we won't be able to create the mount point properly
            LOG.error('Could not initialize a Temporary Folder because '
                      'a database was not configured to be mounted at '
                      'the /temp_folder mount point')
            return
        try:
            manage_addMounts(app, ('/temp_folder',))
            commit(u'Added temp_folder')
            tf = app.temp_folder
        except:
            LOG.error('Could not add a /temp_folder mount point due to an '
                      'error.', exc_info=sys.exc_info())
            return

    # Ensure that there is a transient object container in the temp folder
    config = getConfiguration()

    if not hasattr(aq_base(tf), 'session_data'):
        try:
            from Products.Transience.Transience import TransientObjectContainer
        except ImportError:
            return

        addnotify = getattr(config, 'session_add_notify_script_path', None)
        delnotify = getattr(config, 'session_delete_notify_script_path',
                            None)
        default_limit = 1000
        default_period_secs = 20
        default_timeout_mins = 20

        limit = getattr(config, 'maximum_number_of_session_objects',
                        default_limit)
        timeout_spec = getattr(config, 'session_timeout_minutes',
                               default_timeout_mins)
        period_spec = getattr(config, 'session_resolution_seconds',
                              default_period_secs)

        if addnotify and app.unrestrictedTraverse(addnotify, None) is None:
            LOG.warn('failed to use nonexistent "%s" script as '
                     'session-add-notify-script-path' % addnotify)
            addnotify=None

        if delnotify and app.unrestrictedTraverse(delnotify, None) is None:
            LOG.warn('failed to use nonexistent "%s" script as '
                     'session-delete-notify-script-path' % delnotify)
            delnotify=None

        toc = TransientObjectContainer('session_data',
                                       'Session Data Container',
                                       timeout_mins = timeout_spec,
                                       addNotification = addnotify,
                                       delNotification = delnotify,
                                       limit=limit,
                                       period_secs = period_spec)

        tf._setObject('session_data', toc)
        tf_reserved = getattr(tf, '_reserved_names', ())
        if 'session_data' not in tf_reserved:
            tf._reserved_names = tf_reserved + ('session_data',)
        commit(u'Added session_data to temp_folder')
    return tf # return the tempfolder object for test purposes
class TestTransientObjectContainer(TestCase):

    def setUp(self):
        Products.Transience.Transience.time = fauxtime
        Products.Transience.TransientObject.time = fauxtime
        Products.Transience.Transience.setStrict(1)

        self.errmargin = .20
        self.timeout = fauxtime.timeout
        self.period = 20
        self.t = TransientObjectContainer(
            'sdc', timeout_mins=self.timeout // 60, period_secs=self.period)

    def tearDown(self):
        self.t = None
        Products.Transience.Transience.time = oldtime
        Products.Transience.TransientObject.time = oldtime
        Products.Transience.Transience.setStrict(0)

    def testGetItemFails(self):
        self.assertRaises(KeyError, self._getitemfail)

    def _getitemfail(self):
        return self.t[10]

    def testGetReturnsDefault(self):
        self.assertEqual(self.t.get(10), None)
        self.assertEqual(self.t.get(10, 'foo'), 'foo')

    def testSetItemGetItemWorks(self):
        self.t[10] = 1
        a = self.t[10]
        self.assertEqual(a, 1)

    def testReplaceWorks(self):
        self.t[10] = 1
        self.assertEqual(self.t[10], 1)
        self.t[10] = 2
        self.assertEqual(self.t[10], 2)

    def testHasKeyWorks(self):
        self.t[10] = 1
        self.assertIn(10, self.t)

    def testValuesWorks(self):
        for x in range(10, 110):
            self.t[x] = x
        v = self.t.values()
        v.sort()
        self.assertEqual(len(v), 100)
        i = 10
        for x in v:
            assert x == i
            i = i + 1

    def testKeysWorks(self):
        for x in range(10, 110):
            self.t[x] = x
        v = self.t.keys()
        v.sort()
        self.assertEqual(len(v), 100)
        i = 10
        for x in v:
            self.assertEqual(x, i)
            i = i + 1

    def testItemsWorks(self):
        for x in range(10, 110):
            self.t[x] = x
        v = self.t.items()
        v.sort()
        self.assertEqual(len(v), 100)
        i = 10
        for x in v:
            self.assertEqual(x[0], i)
            self.assertEqual(x[1], i)
            i = i + 1

    def testDeleteInvalidKeyRaisesKeyError(self):
        self.assertRaises(KeyError, self._deletefail)

    def _deletefail(self):
        del self.t[10]

    def testRandomNonOverlappingInserts(self):
        added = {}
        r = range(10, 110)
        for x in r:
            k = random.choice(r)
            if k not in added:
                self.t[k] = x
                added[k] = 1
        addl = list(added.keys())
        addl.sort()
        self.assertEqual(lsubtract(list(self.t.keys()), addl), [])

    def testRandomOverlappingInserts(self):
        added = {}
        r = range(10, 110)
        for x in r:
            k = random.choice(r)
            self.t[k] = x
            added[k] = 1
        addl = list(added.keys())
        addl.sort()
        self.assertEqual(lsubtract(list(self.t.keys()), addl), [])

    def testRandomDeletes(self):
        r = range(10, 1010)
        added = []
        for x in r:
            k = random.choice(r)
            self.t[k] = x
            added.append(k)
        deleted = []
        for x in r:
            k = random.choice(r)
            if k in self.t:
                del self.t[k]
                deleted.append(k)
                if k in self.t:
                    print("had problems deleting %s" % k)
        badones = []
        for x in deleted:
            if x in self.t:
                badones.append(x)
        self.assertEqual(badones, [])

    def testTargetedDeletes(self):
        r = range(10, 1010)
        seen = {}
        for x in r:
            k = random.choice(r)
            vals = seen.setdefault(k, [])
            vals.append(x)
            self.t[k] = x
        couldntdelete = {}
        weird = []
        results = {}
        for x in r:
            try:
                ts, item = self.t.__delitem__(x)
                results[x] = ts, item
            except KeyError as v:
                if v.args[0] != x:
                    weird.append(x)
                couldntdelete[x] = v.args[0]
        self.assertEqual(self.t.keys(), [])

    def testPathologicalRightBranching(self):
        r = list(range(10, 1010))
        for x in r:
            self.t[x] = 1
        self.assertEqual(list(self.t.keys()), r)
        [self.t.__delitem__(x) for x in r]
        self.assertEqual(list(self.t.keys()), [])

    def testPathologicalLeftBranching(self):
        r = list(range(10, 1010))
        revr = r[:]
        revr.reverse()
        for x in revr:
            self.t[x] = 1
        self.assertEqual(list(self.t.keys()), r)
        [self.t.__delitem__(x) for x in revr]
        self.assertEqual(list(self.t.keys()), [])

    def testSuccessorChildParentRewriteExerciseCase(self):
        add_order = [
            85, 73, 165, 273, 215, 142, 233, 67, 86, 166, 235, 225, 255,
            73, 175, 171, 285, 162, 108, 28, 283, 258, 232, 199, 260,
            298, 275, 44, 261, 291, 4, 181, 285, 289, 216, 212, 129,
            243, 97, 48, 48, 159, 22, 285, 92, 110, 27, 55, 202, 294,
            113, 251, 193, 290, 55, 58, 239, 71, 4, 75, 129, 91, 111,
            271, 101, 289, 194, 218, 77, 142, 94, 100, 115, 101, 226,
            17, 94, 56, 18, 163, 93, 199, 286, 213, 126, 240, 245, 190,
            195, 204, 100, 199, 161, 292, 202, 48, 165, 6, 173, 40, 218,
            271, 228, 7, 166, 173, 138, 93, 22, 140, 41, 234, 17, 249,
            215, 12, 292, 246, 272, 260, 140, 58, 2, 91, 246, 189, 116,
            72, 259, 34, 120, 263, 168, 298, 118, 18, 28, 299, 192, 252,
            112, 60, 277, 273, 286, 15, 263, 141, 241, 172, 255, 52, 89,
            127, 119, 255, 184, 213, 44, 116, 231, 173, 298, 178, 196,
            89, 184, 289, 98, 216, 115, 35, 132, 278, 238, 20, 241, 128,
            179, 159, 107, 206, 194, 31, 260, 122, 56, 144, 118, 283,
            183, 215, 214, 87, 33, 205, 183, 212, 221, 216, 296, 40,
            108, 45, 188, 139, 38, 256, 276, 114, 270, 112, 214, 191,
            147, 111, 299, 107, 101, 43, 84, 127, 67, 205, 251, 38, 91,
            297, 26, 165, 187, 19, 6, 73, 4, 176, 195, 90, 71, 30, 82,
            139, 210, 8, 41, 253, 127, 190, 102, 280, 26, 233, 32, 257,
            194, 263, 203, 190, 111, 218, 199, 29, 81, 207, 18, 180,
            157, 172, 192, 135, 163, 275, 74, 296, 298, 265, 105, 191,
            282, 277, 83, 188, 144, 259, 6, 173, 81, 107, 292, 231,
            129, 65, 161, 113, 103, 136, 255, 285, 289, 1,
        ]
        delete_order = [
            276, 273, 12, 275, 2, 286, 127, 83, 92, 33, 101, 195,
            299, 191, 22, 232, 291, 226, 110, 94, 257, 233, 215, 184,
            35, 178, 18, 74, 296, 210, 298, 81, 265, 175, 116, 261,
            212, 277, 260, 234, 6, 129, 31, 4, 235, 249, 34, 289, 105,
            259, 91, 93, 119, 7, 183, 240, 41, 253, 290, 136, 75, 292,
            67, 112, 111, 256, 163, 38, 126, 139, 98, 56, 282, 60, 26,
            55, 245, 225, 32, 52, 40, 271, 29, 252, 239, 89, 87, 205,
            213, 180, 97, 108, 120, 218, 44, 187, 196, 251, 202, 203,
            172, 28, 188, 77, 90, 199, 297, 282, 141, 100, 161, 216,
            73, 19, 17, 189, 30, 258,
        ]
        for x in add_order:
            self.t[x] = 1
        for x in delete_order:
            try:
                del self.t[x]
            except KeyError:
                self.assertNotIn(x, self.t)

    def testGetDelaysTimeout(self):
        for x in range(10, 110):
            self.t[x] = x
        # current bucket will become old after we sleep for a while.
        fauxtime.sleep(self.timeout / 2)
        # these items will be added to the new current bucket by getitem
        for x in range(10, 110):
            self.t.get(x)
        fauxtime.sleep(self.timeout / 2)
        self.assertEqual(len(self.t.keys()), 100)
        for x in range(10, 110):
            self.assertEqual(self.t[x], x)

    def testSetItemDelaysTimeout(self):
        for x in range(10, 110):
            self.t[x] = x
        # current bucket will become old after we sleep for a while.
        fauxtime.sleep(self.timeout / 2)
        # these items will be added to the new current bucket by setitem
        for x in range(10, 110):
            self.t[x] = x + 1
        fauxtime.sleep(self.timeout / 2)
        assert len(self.t.keys()) == 100, len(self.t.keys())
        for x in range(10, 110):
            assert self.t[x] == x + 1

    def testLen(self):
        # This test must not time out else it will fail.
        # make timeout extremely unlikely by setting it very high
        self.t._setTimeout(self.timeout, self.period)
        added = {}
        r = range(10, 1010)
        for x in r:
            k = random.choice(r)
            self.t[k] = x
            added[k] = x
        self.assertEqual(len(self.t), len(added))

        for k in added.keys():
            del self.t[k]

        self.assertEqual(len(self.t), 0)

    def testResetWorks(self):
        self.t[10] = 1
        self.t._reset()
        self.assertFalse(self.t.get(10))

    def testGetTimeoutMinutesWorks(self):
        self.assertEqual(self.t.getTimeoutMinutes(), self.timeout // 60)
        self.t._setTimeout(10, 30)
        self.assertEqual(self.t.getTimeoutMinutes(), 10)
        self.assertEqual(self.t.getPeriodSeconds(), 30)

        # Make sure we always return an integer, our ZMI forms require it
        self.t._timeout_secs = 125
        self.assertTrue(isinstance(self.t.getTimeoutMinutes(), int))

    def test_new(self):
        t = self.t.new('foobieblech')
        self.assertTrue(issubclass(t.__class__, TransientObject))

    def _dupNewItem(self):
        self.t.new('foobieblech')

    def test_newDupFails(self):
        self.t.new('foobieblech')
        self.assertRaises(KeyError, self._dupNewItem)

    def test_new_or_existing(self):
        t = self.t.new('foobieblech')
        t['hello'] = "Here I am!"
        t2 = self.t.new_or_existing('foobieblech')
        self.assertEqual(t2['hello'], "Here I am!")

    def test_getId(self):
        self.assertEqual(self.t.getId(), 'sdc')

    def testSubobjectLimitWorks(self):
        self.t = TransientObjectContainer(
            'a',
            timeout_mins=self.timeout // 60,
            limit=10,
        )
        self.assertRaises(MaxTransientObjectsExceeded, self._maxOut)

    def testZeroTimeoutMeansPersistForever(self):
        self.t._setTimeout(0, self.period)
        self.t._reset()
        for x in range(10, 110):
            self.t[x] = x
        fauxtime.sleep(180)
        self.assertEqual(len(self.t.keys()), 100)

    def testGarbageCollection(self):
        # this is pretty implementation-dependent :-(
        for x in range(0, 100):
            self.t[x] = x
        sleeptime = self.period * SPARE_BUCKETS
        fauxtime.sleep(sleeptime)
        self.t._invoke_finalize_and_gc()
        max_ts = self.t._last_finalized_timeslice()
        keys = list(self.t._data.keys())
        for k in keys:
            self.assertGreater(k, max_ts, "k %s < max_ts %s" % (k, max_ts))

    def _maxOut(self):
        for x in range(11):
            self.t.new(str(x))
class TestTransientObject(TestCase):
    def setUp(self):
        Products.Transience.Transience.time = fauxtime
        Products.Transience.TransientObject.time = fauxtime
        Products.Transience.Transience.setStrict(1)
        self.errmargin = .20
        self.timeout = fauxtime.timeout
        self.t = TransientObjectContainer('sdc', timeout_mins=self.timeout/60)

    def tearDown(self):
        Products.Transience.Transience.time = oldtime
        Products.Transience.TransientObject.time = oldtime
        Products.Transience.Transience.setStrict(0)
        self.t = None
        del self.t

    def test_id(self):
        t = self.t.new('xyzzy')
        self.assertNotEqual(t.getId(), 'xyzzy') # dont acquire
        self.assertEqual(t.getContainerKey(), 'xyzzy')

    def test_validate(self):
        t = self.t.new('xyzzy')
        self.assert_(t.isValid())
        t.invalidate()
        self.assertFalse(t.isValid())

    def test_getLastAccessed(self):
        t = self.t.new('xyzzy')
        ft = fauxtime.time()
        self.assert_(t.getLastAccessed() <= ft)

    def test_getCreated(self):
        t = self.t.new('xyzzy')
        ft = fauxtime.time()
        self.assert_(t.getCreated() <= ft)

    def test_getLastModifiedUnset(self):
        t = self.t.new('xyzzy')
        self.assertEqual(t.getLastModified(), None)

    def test_getLastModifiedSet(self):
        t = self.t.new('xyzzy')
        t['a'] = 1
        self.assertNotEqual(t.getLastModified(), None)

    def testSetLastModified(self):
        t = self.t.new('xyzzy')
        t.setLastModified()
        self.assertNotEqual(t.getLastModified(), None)

    def test_setLastAccessed(self):
        t = self.t.new('xyzzy')
        ft = fauxtime.time()
        self.assert_(t.getLastAccessed() <= ft)
        fauxtime.sleep(self.timeout * 2)   # go to sleep past the granularity
        ft2 = fauxtime.time()
        t.setLastAccessed()
        ft3 = fauxtime.time()
        self.assert_(t.getLastAccessed() <= ft3)
        self.assert_(t.getLastAccessed() >= ft2)

    def _genKeyError(self, t):
        return t.get('foobie')

    def _genLenError(self, t):
        return t.len()

    def test_dictionaryLike(self):
        t = self.t.new('keytest')
        t.update(data)
        self.assertEqual(t.keys(), data.keys())
        self.assertEqual(t.values(), data.values())
        self.assertEqual(t.items(), data.items())
        for k in data.keys():
            self.assertEqual(t.get(k), data.get(k))
        self.assertEqual(t.get('foobie'), None)
        self.assertRaises(AttributeError, self._genLenError, t)
        self.assertEqual(t.get('foobie',None), None)
        self.assert_(t.has_key('a'))
        self.assertFalse(t.has_key('foobie'))
        t.clear()
        self.assertEqual(len(t.keys()), 0)

    def test_TTWDictionary(self):
        t = self.t.new('mouthfultest')
        t.set('foo', 'bar')
        self.assertEqual(t['foo'], 'bar')
        self.assertEqual(t.get('foo'), 'bar')
        t.set('foobie', 'blech')
        t.delete('foobie')
        self.assertEqual(t.get('foobie'), None)

    def test_repr_leaking_information(self):
        # __repr__ used to show all contents, which could lead to sensitive
        # information being visible in e.g. the ErrorLog object.
        t = self.t.new('password-storing-session')
        t.set('__ac_password__', 'secret')
        self.assertFalse( repr(t).find('secret') != -1
                   , '__repr__ leaks: %s' % repr(t)
                   )
Ejemplo n.º 19
0
class TestTransientObject(TestCase):
    def setUp(self):
        Products.Transience.Transience.time = fauxtime
        Products.Transience.TransientObject.time = fauxtime
        Products.Transience.Transience.setStrict(1)
        self.errmargin = .20
        self.timeout = 60
        self.t = TransientObjectContainer('sdc',
                                          timeout_mins=self.timeout / 60)

    def tearDown(self):
        Products.Transience.Transience.time = oldtime
        Products.Transience.TransientObject.time = oldtime
        Products.Transience.Transience.setStrict(0)
        self.t = None
        del self.t

    def test_id(self):
        t = self.t.new('xyzzy')
        self.failIfEqual(t.getId(), 'xyzzy')  # dont acquire
        self.assertEqual(t.getContainerKey(), 'xyzzy')

    def test_validate(self):
        t = self.t.new('xyzzy')
        self.assert_(t.isValid())
        t.invalidate()
        self.failIf(t.isValid())

    def test_getLastAccessed(self):
        t = self.t.new('xyzzy')
        ft = fauxtime.time()
        self.assert_(t.getLastAccessed() <= ft)

    def test_getCreated(self):
        t = self.t.new('xyzzy')
        ft = fauxtime.time()
        self.assert_(t.getCreated() <= ft)

    def test_getLastModifiedUnset(self):
        t = self.t.new('xyzzy')
        self.assertEqual(t.getLastModified(), None)

    def test_getLastModifiedSet(self):
        t = self.t.new('xyzzy')
        t['a'] = 1
        self.failIfEqual(t.getLastModified(), None)

    def testSetLastModified(self):
        t = self.t.new('xyzzy')
        ft = fauxtime.time()
        t.setLastModified()
        self.failIfEqual(t.getLastModified(), None)

    def test_setLastAccessed(self):
        t = self.t.new('xyzzy')
        ft = fauxtime.time()
        self.assert_(t.getLastAccessed() <= ft)
        fauxtime.sleep(self.timeout)  # go to sleep past the granuarity
        ft2 = fauxtime.time()
        t.setLastAccessed()
        ft3 = fauxtime.time()
        self.assert_(t.getLastAccessed() <= ft3)
        self.assert_(t.getLastAccessed() >= ft2)

    def _genKeyError(self, t):
        return t.get('foobie')

    def _genLenError(self, t):
        return t.len()

    def test_dictionaryLike(self):
        t = self.t.new('keytest')
        t.update(data)
        self.assertEqual(t.keys(), data.keys())
        self.assertEqual(t.values(), data.values())
        self.assertEqual(t.items(), data.items())
        for k in data.keys():
            self.assertEqual(t.get(k), data.get(k))
        self.assertEqual(t.get('foobie'), None)
        self.assertRaises(AttributeError, self._genLenError, t)
        self.assertEqual(t.get('foobie', None), None)
        self.assert_(t.has_key('a'))
        self.failIf(t.has_key('foobie'))
        t.clear()
        self.assertEqual(len(t.keys()), 0)

    def test_TTWDictionary(self):
        t = self.t.new('mouthfultest')
        t.set('foo', 'bar')
        self.assertEqual(t['foo'], 'bar')
        self.assertEqual(t.get('foo'), 'bar')
        t.set('foobie', 'blech')
        t.delete('foobie')
        self.assertEqual(t.get('foobie'), None)

    def test_repr_leaking_information(self):
        # __repr__ used to show all contents, which could lead to sensitive
        # information being visible in e.g. the ErrorLog object.
        t = self.t.new('password-storing-session')
        t.set('__ac_password__', 'secret')
        self.failIf(
            repr(t).find('secret') != -1, '__repr__ leaks: %s' % repr(t))
Ejemplo n.º 20
0
class TestTransientObject(TestCase):
    def setUp(self):
        Products.Transience.Transience.time = fauxtime
        Products.Transience.TransientObject.time = fauxtime
        self.errmargin = .20
        self.timeout = 60
        self.t = TransientObjectContainer('sdc', timeout_mins=self.timeout/60)

    def tearDown(self):
        Products.Transience.Transience.time = oldtime
        Products.Transience.TransientObject.time = oldtime
        self.t = None
        del self.t

    def test_id(self):
        t = self.t.new('xyzzy')
        assert t.getId() != 'xyzzy'
        assert t.getContainerKey() == 'xyzzy'

    def test_validate(self):
        t = self.t.new('xyzzy')
        assert t.isValid()
        t.invalidate()
        assert not t.isValid()

    def test_getLastAccessed(self):
        t = self.t.new('xyzzy')
        ft = fauxtime.time()
        assert t.getLastAccessed() <= ft

    def test_getCreated(self):
        t = self.t.new('xyzzy')
        ft = fauxtime.time()
        assert t.getCreated() <= ft

    def test_getLastModifiedUnset(self):
        t = self.t.new('xyzzy')
        assert t.getLastModified() == None

    def test_getLastModifiedSet(self):
        t = self.t.new('xyzzy')
        t['a'] = 1
        assert t.getLastModified() is not None

    def testSetLastModified(self):
        t = self.t.new('xyzzy')
        ft = fauxtime.time()
        t.setLastModified()
        assert t.getLastModified() is not None

    def test_setLastAccessed(self):
        t = self.t.new('xyzzy')
        ft = fauxtime.time()
        assert t.getLastAccessed() <= ft
        fauxtime.sleep(self.timeout)   # go to sleep past the granuarity
        ft2 = fauxtime.time()
        t.setLastAccessed()
        ft3 = fauxtime.time()
        assert t.getLastAccessed() <= ft3
        assert t.getLastAccessed() >= ft2

    def _genKeyError(self, t):
        return t.get('foobie')

    def _genLenError(self, t):
        return t.len()

    def test_dictionaryLike(self):
        t = self.t.new('keytest')
        t.update(data)
        assert t.keys() == data.keys()
        assert t.values() == data.values()
        assert t.items() == data.items()
        for k in data.keys():
            assert t.get(k) == data.get(k)
        assert t.get('foobie') is None
        self.assertRaises(AttributeError, self._genLenError, t)
        assert t.get('foobie',None) is None
        assert t.has_key('a')
        assert not t.has_key('foobie')
        t.clear()
        assert not len(t.keys())

    def test_TTWDictionary(self):
        t = self.t.new('mouthfultest')
        t.set('foo', 'bar')
        assert t['foo'] == 'bar'
        assert t.get('foo') == 'bar'
        t.set('foobie', 'blech')
        t.delete('foobie')
        assert t.get('foobie') is None
class TestSlowTransientObjectContainer(TestCase):

    def setUp(self):
        Products.Transience.Transience.time = slowfauxtime
        Products.Transience.TransientObject.time = slowfauxtime
        Products.Transience.Transience.setStrict(1)

        self.errmargin = .20
        self.timeout = 120
        self.period = 20
        self.t = TransientObjectContainer(
            'sdc', timeout_mins=self.timeout // 60, period_secs=self.period)

    def tearDown(self):
        self.t = None
        Products.Transience.Transience.time = oldtime
        Products.Transience.TransientObject.time = oldtime
        Products.Transience.Transience.setStrict(0)

    def testChangingTimeoutWorks(self):
        # TODO: This test is slooooow
        # 1 minute
        for x in range(10, 110):
            self.t[x] = x
        slowfauxtime.sleep(self.timeout * (self.errmargin + 1))
        self.assertEqual(len(self.t.keys()), 0)

        # 2 minutes
        self.t._setTimeout(self.timeout // 60 * 2, self.period)
        self.t._reset()
        for x in range(10, 110):
            self.t[x] = x
        slowfauxtime.sleep(self.timeout)

        self.assertEqual(len(self.t.keys()), 100)
        slowfauxtime.sleep(self.timeout * (self.errmargin + 1))
        self.assertEqual(len(self.t.keys()), 0)

        # 3 minutes
        self.t._setTimeout(self.timeout // 60 * 3, self.period)
        self.t._reset()
        for x in range(10, 110):
            self.t[x] = x
        slowfauxtime.sleep(self.timeout)
        self.assertEqual(len(self.t.keys()), 100)
        slowfauxtime.sleep(self.timeout)
        self.assertEqual(len(self.t.keys()), 100)
        slowfauxtime.sleep(self.timeout * (self.errmargin + 1))
        self.assertEqual(len(self.t.keys()), 0)

    def testItemsGetExpired(self):
        for x in range(10, 110):
            self.t[x] = x
        # these items will time out while we sleep
        slowfauxtime.sleep(self.timeout * (self.errmargin + 1))
        for x in range(110, 210):
            self.t[x] = x
        self.assertEqual(len(self.t.keys()), 100)

        # call _gc just to make sure __len__ gets changed after a gc
        # self.t._gc()
        self.assertEqual(len(self.t), 100)

        # we should still have 100 - 199
        for x in range(110, 210):
            self.assertEqual(self.t[x], x)
        # but we shouldn't have 0 - 100
        for x in range(10, 110):
            try:
                self.t[x]
            except KeyError:
                pass
            else:
                assert 1 == 2, x