def test_crontab_runjob_event(self):
     # a job withtout any utility attached must run as NOTRUN
     # even if it is a NOOP
     self.cron.logs = []
     self.cron.name = u'testjobrunnercron'
     self.cron.save()                               
     adp =  self.get_adp(self.cron)
     self.assertTrue(adp is None)
     self.gsm.registerHandler(finished_event)
     self.gsm.registerHandler(started_event)
     ret = runJob(self.portal, self.cron)
     self.assertEquals(Crontab.load().by_name('testjobrunnercron')[0].logs[0].status, 3)
     self.assertEquals(_started[0], 1)
     self.gsm.unregisterHandler(finished_event)
     self.gsm.unregisterHandler(started_event)
     ret = runJob(self.portal, self.cron)
     self.assertEquals(len(Crontab.load().by_name('testjobrunnercron')[-1].logs), 2)
     self.assertEquals(len(_started), 1)
     self.cron.name = u'testcron'
     self.cron.save()                                
    def test_crontab_runjob_pathrun(self):
        # a job withtout any utility attached must run as NOTRUN
        # even if it is a NOOP
        [self.layer['queue'].remove(a) for a in self.layer['queue']]
        self.cron.name = u'testjobrunnercron_path'
        self.cron.save()
        ret = runJob(self.portal, self.cron)
        self.assertEquals(Crontab.load().by_name('testjobrunnercron_path')[0].logs[0].status, 3)
        #
        # don't register adapter. Instead create simple python script and cron.name path to script
        #
        txt = "context.result.append(1)"
        ps = self._newPS(txt, {'name_context': 'context'})
        # zope can't create use unicode ids
        self.portal[self.cron.name.encode('ascii')] = ps
        self.portal.result = []

        transaction.commit()
        ret = runJob(self.portal, self.cron)
        self.assertEquals(
            ret,
            (1, [], self.cron.uid, ('', 'plone')))
        self.assertEquals(self.portal.result, [1])
        transaction.commit()

        #
        # same with logs
        #
        txt = "context.result.append(context.result[-1]+1); return 'warn'"
        self.portal._getOb(self.cron.name.encode('ascii')).write(txt)
        transaction.commit()
        ret = runJob(self.portal, self.cron)
        self.assertEquals(
            ret,
            (2, [u'warn'], self.cron.uid, ('', 'plone')))
        self.assertEquals(self.portal.result, [1, 2])
        self.assertEquals(Crontab.load().by_name('testjobrunnercron_path')[0].logs[0].status, 2)
        self.assertEquals(Crontab.load().by_name('testjobrunnercron_path')[0].logs[0].messages, [u'warn'])
        transaction.commit()

        #
        # register an adapter with trivial code
        # which raise a failure
        #
        txt = "raise Exception('foo')"
        self.portal._getOb(self.cron.name.encode('ascii')).write(txt)
        transaction.commit()
        ret = runJob(self.portal, self.cron)
        self.assertEquals(
            ret,
            (0, [u'foo'], self.cron.uid, ('', 'plone')))
        transaction.commit()
        self.assertEquals(Crontab.load().by_name('testjobrunnercron_path')[0].logs[0].status, 0)
        self.assertEquals(Crontab.load().by_name('testjobrunnercron_path')[0].logs[0].messages, [u'foo'])

        #
        # add a script to a folder
        #
        txt = "context.result.append(context.result[-1]+1)"
        ps = self._newPS(txt, {'name_context': 'context'})
        self.portal['test-folder']['test_in_folder'] = ps
        self.cron.name = u'test-folder/test_in_folder'
        self.cron.save()
        ret = runJob(self.portal, self.cron)
        transaction.commit()
        self.assertEquals(
            ret,
            (1, [], self.cron.uid, ('', 'plone')))
        self.assertEquals(self.portal.result, [1, 2, 3])
        transaction.commit()
        self.assertEquals(Crontab.load().by_name('test-folder/test_in_folder')[0].logs[0].status, 1)
    def test_crontab_runjob_run(self):
        # a job withtout any utility attached must run as NOTRUN
        # even if it is a NOOP
        [self.layer['queue'].remove(a) for a in self.layer['queue']]
        self.cron.name = u'testjobrunnercron'
        self.cron.save()
        adp =  self.get_adp(self.cron)
        self.assertTrue(adp is None)
        ret = runJob(self.portal, self.cron)
        self.assertEquals(Crontab.load().by_name('testjobrunnercron')[0].logs[0].status, 3)
        #
        # register an adapter with trivial code
        # no failure
        #
        gsm = getGlobalSiteManager()
        psm = self.portal.getSiteManager() 
        gsm.registerAdapter(SimpleRunner, name=self.cron.name)
        transaction.commit()
        adp = self.get_adp(self.cron)
        self.assertFalse(adp is None)
        ret = runJob(self.portal, self.cron)
        self.assertEquals(_results, [1])
        self.assertEquals(
            ret,
            (1, [], self.cron.uid, ('', 'plone')))
        gsm.unregisterAdapter(SimpleRunner, name=self.cron.name)
        transaction.commit()

        #
        # same with logs
        #
        gsm.registerAdapter(SimpleRunnerWithWarn, name=self.cron.name)
        transaction.commit()
        ret = runJob(self.portal, self.cron)
        self.assertEquals(_results, [1, 2])
        self.assertEquals(
            ret,
            (2, [u'warn'], self.cron.uid, ('', 'plone')))
        self.assertEquals(Crontab.load().by_name('testjobrunnercron')[0].logs[0].status, 2)
        self.assertEquals(Crontab.load().by_name('testjobrunnercron')[0].logs[0].messages, [u'warn'])
        transaction.commit()
        gsm.unregisterAdapter(SimpleRunnerWithWarn, name=self.cron.name)
        transaction.commit()

        #
        # register an adapter with trivial code
        # which raise a failure
        #
        gsm.registerAdapter(FailureRunner, name=self.cron.name)
        transaction.commit()
        ret = runJob(self.portal, self.cron)
        self.assertEquals(
            ret,
            (0, [u'foo'], self.cron.uid, ('', 'plone')))
        gsm.unregisterAdapter(FailureRunner)
        transaction.commit()
        self.assertEquals(Crontab.load().by_name('testjobrunnercron')[0].logs[0].status, 0)
        self.assertEquals(Crontab.load().by_name('testjobrunnercron')[0].logs[0].messages, [u'foo'])
        gsm.unregisterAdapter(FailureRunner, name=self.cron.name)
        transaction.commit()

        #
        # register an adapter with trivial code
        # no failure / registered locally
        #
        ret = runJob(self.portal, self.cron)
        self.assertEquals(Crontab.load().by_name('testjobrunnercron')[0].logs[0].status, 3)
        psm.registerAdapter(LocalSimpleRunner, name=self.cron.name)
        transaction.commit()
        ret = runJob(self.portal, self.cron)
        self.assertEquals(_results, [1, 2, 3])
        self.assertEquals(Crontab.load().by_name('testjobrunnercron')[0].logs[0].messages, [u'local'])
        psm.unregisterAdapter(LocalSimpleRunner, name=self.cron.name)
        transaction.commit()
        self.cron.name = u'testcron'
        self.cron.save() 
        transaction.commit()