[fix] use importlib instead of imp.load_source in test_runner. Fixes to scheduler.py

This commit is contained in:
Anand Doshi 2016-04-13 21:00:08 +05:30
parent 32b3d7c279
commit 13e43fcbcd
3 changed files with 25 additions and 15 deletions

View file

@ -71,7 +71,7 @@ def run_all_tests(app=None, verbose=False, profile=False):
filename = cstr(filename)
if filename.startswith("test_") and filename.endswith(".py"):
# print filename[:-3]
_add_test(path, filename, verbose, test_suite=test_suite)
_add_test(app, path, filename, verbose, test_suite=test_suite)
if profile:
pr = cProfile.Profile()
@ -133,14 +133,22 @@ def _run_unittest(module, verbose=False, tests=(), profile=False):
return out
def _add_test(path, filename, verbose, test_suite=None):
def _add_test(app, path, filename, verbose, test_suite=None):
import os, imp
if os.path.sep.join(["doctype", "doctype", "boilerplate"]) in path:
# in /doctype/doctype/boilerplate/
return
module = imp.load_source(filename[:-3], os.path.join(path, filename))
app_path = frappe.get_pymodule_path(app)
relative_path = os.path.relpath(path, app_path)
if relative_path=='.':
module_name = app
else:
module_name = '{app}.{relative_path}.{module_name}'.format(app=app,
relative_path=relative_path.replace('/', '.'), module_name=filename[:-3])
module = frappe.get_module(module_name)
if getattr(module, "selenium_tests", False) and not frappe.conf.run_selenium_tests:
return

View file

@ -9,6 +9,10 @@ from dateutil.relativedelta import relativedelta
import frappe
import json, time
def test_timeout():
'''This function needs to be pickleable'''
time.sleep(100)
class TestScheduler(TestCase):
def setUp(self):
@ -58,7 +62,3 @@ class TestScheduler(TestCase):
def tearDown(self):
frappe.flags.ran_schedulers = []
def test_timeout():
'''This function needs to be pickleable'''
time.sleep(100)

View file

@ -82,19 +82,19 @@ def enqueue_events(site, queued_jobs):
out = []
if last:
last = datetime.strptime(last, DATETIME_FORMAT)
out = enqueue_applicable_events(nowtime, last, queued_jobs, site=site)
out = enqueue_applicable_events(site, nowtime, last, queued_jobs)
return '\n'.join(out)
def enqueue_applicable_events(nowtime, last, queued_jobs, site):
def enqueue_applicable_events(site, nowtime, last, queued_jobs=()):
nowtime_str = nowtime.strftime(DATETIME_FORMAT)
out = []
enabled_events = get_enabled_scheduler_events()
def trigger_if_enabled(event, site, now=False):
def trigger_if_enabled(site, event):
if event in enabled_events:
trigger(site, event, queued_jobs, now=now)
trigger(site, event, queued_jobs)
_log(event)
def _log(event):
@ -114,23 +114,25 @@ def enqueue_applicable_events(nowtime, last, queued_jobs, site):
trigger_if_enabled(site, "weekly_long")
if "all" not in enabled_events:
trigger(site, queued_jobs, "all")
trigger(site, "all", queued_jobs)
if "hourly" not in enabled_events:
trigger(site, queued_jobs, "hourly")
trigger(site, "hourly", queued_jobs)
if nowtime.hour != last.hour:
trigger_if_enabled(site, "hourly")
trigger_if_enabled(site, "hourly_long")
trigger_if_enabled("all", site=site)
trigger_if_enabled(site, "all")
return out
def trigger(site, event, queued_jobs, now=False):
def trigger(site, event, queued_jobs=(), now=False):
"""trigger method in hooks.scheduler_events"""
queue = 'long' if event.endswith('_long') else 'short'
timeout = queue_timeout[queue]
if not queued_jobs and not now:
queued_jobs = get_jobs(site=site, queue=queue)
for handler in frappe.get_hooks("scheduler_events").get(event, []):
if not now: