From 90e606dcfdd987249fc1b72dfd7253530a9ef94a Mon Sep 17 00:00:00 2001 From: ilvalle Date: Sat, 29 Apr 2017 20:41:12 +0200 Subject: [PATCH] fix cron with py3, added initial tests, close #1618 --- gluon/newcron.py | 9 ++++++--- gluon/tests/__init__.py | 1 + gluon/tests/test_cron.py | 24 ++++++++++++++++++++++++ 3 files changed, 31 insertions(+), 3 deletions(-) create mode 100644 gluon/tests/test_cron.py diff --git a/gluon/newcron.py b/gluon/newcron.py index 1a878589..f7482fcb 100644 --- a/gluon/newcron.py +++ b/gluon/newcron.py @@ -19,13 +19,14 @@ import sched import re import datetime import platform -import gluon.fileutils from functools import reduce try: import cPickle as pickle except: import pickle from gluon.settings import global_settings +from gluon import fileutils +from gluon._compat import to_bytes from pydal.contrib import portalocker logger = logging.getLogger("web2py.cron") @@ -116,7 +117,7 @@ class Token(object): def __init__(self, path): self.path = os.path.join(path, 'cron.master') if not os.path.exists(self.path): - fileutils.write_file(self.path, '', 'wb') + fileutils.write_file(self.path, to_bytes(''), 'wb') self.master = None self.now = time.time() @@ -139,7 +140,7 @@ class Token(object): if portalocker.LOCK_EX is None: logger.warning('WEB2PY CRON: Disabled because no file locking') return None - self.master = open(self.path, 'rb+') + self.master = fileutils.open_file(self.path, 'rb+') try: ret = None portalocker.lock(self.master, portalocker.LOCK_EX) @@ -167,6 +168,7 @@ class Token(object): """ Writes into cron.master the time when cron job was completed """ + ret = self.master.closed if not self.master.closed: portalocker.lock(self.master, portalocker.LOCK_EX) logger.debug('WEB2PY CRON: Releasing cron lock') @@ -177,6 +179,7 @@ class Token(object): pickle.dump((self.now, time.time()), self.master) portalocker.unlock(self.master) self.master.close() + return ret def rangetolist(s, period='min'): diff --git a/gluon/tests/__init__.py b/gluon/tests/__init__.py index 2f111fe3..7c200f94 100644 --- a/gluon/tests/__init__.py +++ b/gluon/tests/__init__.py @@ -22,6 +22,7 @@ from .test_appadmin import * from .test_web import * from .test_sqlhtml import * from .test_scheduler import * +from .test_cron import * if sys.version[:3] == '2.7': from .test_is_url import * diff --git a/gluon/tests/test_cron.py b/gluon/tests/test_cron.py new file mode 100644 index 00000000..47a30af7 --- /dev/null +++ b/gluon/tests/test_cron.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" Unit tests for cron """ +import unittest, os +from gluon.newcron import Token, crondance + +class TestCron(unittest.TestCase): + + + def test_Token(self): + appname_path = os.path.join(os.getcwd(), 'applications', 'welcome') + t = Token(path=appname_path) + self.assertNotEqual(t.acquire(), None) + self.assertFalse(t.release()) + self.assertEqual(t.acquire(), None) + self.assertTrue(t.release()) + return + + def test_crondance(self): + #TODO update crondance to return something + crondance(os.getcwd()) + +