diff --git a/src/croniter/tests/test_croniter_speed.py b/src/croniter/tests/test_croniter_speed.py new file mode 100755 index 0000000..ea5f5c0 --- /dev/null +++ b/src/croniter/tests/test_croniter_speed.py @@ -0,0 +1,121 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +from __future__ import absolute_import, print_function + +try: + import unittest2 as unittest +except ImportError: + import unittest + +import os +import sys +from datetime import datetime +from timeit import Timer + +import pytz + +from croniter import cron_m, croniter +from croniter.tests import base + + +class CroniterSpeedTest(base.TestCase): + def run_long_test(self, iterations=1): + dt = datetime(2010, 1, 23, 12, 18) + itr = croniter("*/1 * * * *", dt) + for i in range(iterations): # ~ 58 + itr.get_next() + + itr = croniter("*/5 * * * *", dt) + for i in range(iterations): + itr.get_next() + + dt = datetime(2010, 1, 24, 12, 2) + itr = croniter("0 */3 * * *", dt) + for i in range(iterations): + itr.get_next() + + dt = datetime(2010, 2, 24, 12, 9) + itr = croniter("0 0 */3 * *", dt) + for i in range(iterations): + itr.get_next(datetime) + + # test leap year + dt = datetime(1996, 2, 27) + itr = croniter("0 0 * * *", dt) + for i in range(iterations): + itr.get_next(datetime) + + dt2 = datetime(2000, 2, 27) + itr2 = croniter("0 0 * * *", dt2) + for i in range(iterations): + itr2.get_next(datetime) + + dt = datetime(2010, 2, 25) + itr = croniter("0 0 * * sat", dt) + for i in range(iterations): + itr.get_next(datetime) + + dt = datetime(2010, 1, 25) + itr = croniter("0 0 1 * wed", dt) + for i in range(iterations): + itr.get_next(datetime) + + dt = datetime(2010, 1, 25) + itr = croniter("0 0 1 * *", dt) + for i in range(iterations): + itr.get_next() + + dt = datetime(2010, 8, 25, 15, 56) + itr = croniter("*/1 * * * *", dt) + for i in range(iterations): + itr.get_prev(datetime) + + dt = datetime(2010, 8, 25, 15, 0) + itr = croniter("*/1 * * * *", dt) + for i in range(iterations): + itr.get_prev(datetime) + + dt = datetime(2010, 8, 25, 0, 0) + itr = croniter("*/1 * * * *", dt) + for i in range(iterations): + itr.get_prev(datetime) + + dt = datetime(2010, 8, 25, 15, 56) + itr = croniter("0 0 * * sat,sun", dt) + for i in range(iterations): + itr.get_prev(datetime) + + dt = datetime(2010, 2, 25) + itr = croniter("0 0 * * 7", dt) + for i in range(iterations): + itr.get_prev(datetime) + + # dst regression test + tz = pytz.timezone("Europe/Bucharest") + offsets = set() + dst_cron = "15 0,3 * 3 *" + dst_iters = 2 * 31 * (iterations / 40) + dt = datetime(2010, 1, 25, tzinfo=tz) + itr = croniter(dst_cron, dt) + for i in range(dst_iters): + d = itr.get_next(datetime) + offsets.add(d.utcoffset()) + itr = croniter(dst_cron, dt) + for i in range(dst_iters): + d = itr.get_prev(datetime) + offsets.add(d.utcoffset()) + + def test_not_long_time(self): + if int(sys.version[0]) < 3: + return + iterations = int(os.environ.get("CRONITER_TEST_SPEED_ITERATIONS", "40")) + globs = globals() + globs.update(locals()) + t = Timer("self.run_long_test(iterations)", globals=globs) + limit = 80 + ret = t.timeit(limit) + self.assertTrue(ret < limit, "Regression in croniter speed detected ({0} {1}).".format(ret, limit)) + + +if __name__ == "__main__": + unittest.main() diff --git a/src/croniter/tests/test_speed.py b/src/croniter/tests/test_speed.py deleted file mode 100755 index d097a58..0000000 --- a/src/croniter/tests/test_speed.py +++ /dev/null @@ -1,225 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -from __future__ import absolute_import, print_function - -from datetime import datetime - -from croniter import croniter -from croniter.tests import base - - -class timerTest(object): - def __init__(self): - self.tests = tuple(getattr(self, m) for m in dir(self) if m.lower().startswith("test")) - - def run(self): - for test in self.tests: - test() - - -class CroniterTest(timerTest): - def testMinute(self): - # minute asterisk - base = datetime(2010, 1, 23, 12, 18) - itr = croniter("*/1 * * * *", base) - n1 = itr.get_next(datetime) # 19 - base.year == n1.year - base.month == n1.month - base.day == n1.day - base.hour == n1.hour - base.minute == n1.minute - 1 - for i in range(39): # ~ 58 - itr.get_next() - - n2 = itr.get_next(datetime) - n2.minute == 59 - - n3 = itr.get_next(datetime) - - n3.minute == 0 - n3.hour == 13 - - itr = croniter("*/5 * * * *", base) - n4 = itr.get_next(datetime) - n4.minute == 20 - for i in range(6): - itr.get_next() - n5 = itr.get_next(datetime) - n5.minute == 55 - - n6 = itr.get_next(datetime) - n6.minute == 0 - n6.hour == 13 - - def testHour(self): - base = datetime(2010, 1, 24, 12, 2) - itr = croniter("0 */3 * * *", base) - n1 = itr.get_next(datetime) - - n1.hour == 15 - n1.minute == 0 - - for i in range(2): - itr.get_next() - - n2 = itr.get_next(datetime) - n2.hour == 0 - n2.day == 25 - - def testDay(self): - base = datetime(2010, 2, 24, 12, 9) - itr = croniter("0 0 */3 * *", base) - n1 = itr.get_next(datetime) - n1.day == 27 - n2 = itr.get_next(datetime) - n2.day == 3 - - # test leap year - base = datetime(1996, 2, 27) - itr = croniter("0 0 * * *", base) - n1 = itr.get_next(datetime) - n1.day == 28 - n1.month == 2 - n2 = itr.get_next(datetime) - n2.day == 29 - n2.month == 2 - - base2 = datetime(2000, 2, 27) - itr2 = croniter("0 0 * * *", base2) - n3 = itr2.get_next(datetime) - n3.day == 28 - n3.month == 2 - n4 = itr2.get_next(datetime) - n4.day == 29 - n4.month == 2 - - def testWeekDay(self): - base = datetime(2010, 2, 25) - itr = croniter("0 0 * * sat", base) - n1 = itr.get_next(datetime) - n1.isoweekday() == 6 - n1.day == 27 - - n2 = itr.get_next(datetime) - n2.isoweekday() == 6 - n2.day == 6 - n2.month == 3 - - base = datetime(2010, 1, 25) - itr = croniter("0 0 1 * wed", base) - n1 = itr.get_next(datetime) - n1.month == 1 - n1.day == 27 - n1.year == 2010 - - n2 = itr.get_next(datetime) - n2.month == 2 - n2.day == 1 - n2.year == 2010 - - n3 = itr.get_next(datetime) - n3.month == 2 - n3.day == 3 - n3.year == 2010 - - def testMonth(self): - base = datetime(2010, 1, 25) - itr = croniter("0 0 1 * *", base) - n1 = itr.get_next(datetime) - - n1.month == 2 - n1.day == 1 - - n2 = itr.get_next(datetime) - n2.month == 3 - n2.day == 1 - - for i in range(8): - itr.get_next() - - n3 = itr.get_next(datetime) - n3.month == 12 - n3.year == 2010 - - n4 = itr.get_next(datetime) - n4.month == 1 - n4.year == 2011 - - def testPrevMinute(self): - base = datetime(2010, 8, 25, 15, 56) - itr = croniter("*/1 * * * *", base) - prev = itr.get_prev(datetime) - base.year == prev.year - base.month == prev.month - base.day == prev.day - base.hour == prev.hour - base.minute, prev.minute + 1 - - base = datetime(2010, 8, 25, 15, 0) - itr = croniter("*/1 * * * *", base) - prev = itr.get_prev(datetime) - base.year == prev.year - base.month == prev.month - base.day == prev.day - base.hour == prev.hour + 1 - 59 == prev.minute - - base = datetime(2010, 8, 25, 0, 0) - itr = croniter("*/1 * * * *", base) - prev = itr.get_prev(datetime) - base.year == prev.year - base.month == prev.month - base.day == prev.day + 1 - 23 == prev.hour - 59 == prev.minute - - def testPrevWeekDay(self): - base = datetime(2010, 8, 25, 15, 56) - itr = croniter("0 0 * * sat,sun", base) - prev1 = itr.get_prev(datetime) - prev1.year == base.year - prev1.month == base.month - prev1.day == 22 - prev1.hour == 0 - prev1.minute == 0 - - prev2 = itr.get_prev(datetime) - prev2.year == base.year - prev2.month == base.month - prev2.day == 21 - prev2.hour == 0 - prev2.minute == 0 - - prev3 = itr.get_prev(datetime) - prev3.year == base.year - prev3.month == base.month - prev3.day == 15 - prev3.hour == 0 - prev3.minute == 0 - - def testISOWeekday(self): - base = datetime(2010, 2, 25) - itr = croniter("0 0 * * 7", base) - n1 = itr.get_next(datetime) - n1.isoweekday() == 7 - n1.day == 28 - - n2 = itr.get_next(datetime) - n2.isoweekday() == 7 - n2.day == 7 - n2.month == 3 - - -class TestCase(base.TestCase): - """make zope.testrunner happy""" - - def test_Noop(self): - self.assertEqual(1, 1) - - -if __name__ == "__main__": - from timeit import Timer - - t = Timer("c=CroniterTest();c.run()", "from __main__ import CroniterTest") - print(t.timeit(200))