From bbca8bd17ec4294b21e2f6fc2c62d7a67ef7fab2 Mon Sep 17 00:00:00 2001 From: "chm@openerp.com" <> Date: Tue, 18 Mar 2014 13:22:50 +0100 Subject: [PATCH 1/5] [PATCH] sle bzr revid: chm@openerp.com-20140318122250-22bt2bcfzvxowkvf --- openerp/modules/loading.py | 8 ++++++- openerp/modules/module.py | 48 +++++++++++++++++++------------------- 2 files changed, 31 insertions(+), 25 deletions(-) diff --git a/openerp/modules/loading.py b/openerp/modules/loading.py index 681d8534c05..5635e42e780 100644 --- a/openerp/modules/loading.py +++ b/openerp/modules/loading.py @@ -42,6 +42,7 @@ from openerp import SUPERUSER_ID from openerp.tools.translate import _ from openerp.modules.module import initialize_sys_path, \ load_openerp_module, init_module_models, adapt_version +from module import runs_post_install _logger = logging.getLogger(__name__) _test_logger = logging.getLogger('openerp.tests') @@ -425,8 +426,13 @@ def load_modules(db, force_demo=False, status=None, update_module=False): for model in registry.models.values(): model._register_hook(cr) + # STEP 9: Run the post-install tests + cr.commit() + if openerp.tools.config['test_enable']: + cr.execute("SELECT name FROM ir_module_module WHERE state='installed'") + for module_name in cr.fetchall(): + report.record_result(openerp.modules.module.run_unit_tests(module_name[0], cr.dbname, position=runs_post_install)) finally: cr.close() - # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/openerp/modules/module.py b/openerp/modules/module.py index 8958813baa2..551b7a664b5 100644 --- a/openerp/modules/module.py +++ b/openerp/modules/module.py @@ -356,30 +356,6 @@ class TestStream(object): current_test = None -def run_unit_tests(module_name, dbname): - """ - :returns: ``True`` if all of ``module_name``'s tests succeeded, ``False`` - if any of them failed. - :rtype: bool - """ - global current_test - current_test = module_name - mods = get_test_modules(module_name) - r = True - for m in mods: - tests = unwrap_suite(unittest2.TestLoader().loadTestsFromModule(m)) - suite = unittest2.TestSuite(itertools.ifilter(runs_at_install, tests)) - _logger.info('running %s tests.', m.__name__) - - result = unittest2.TextTestRunner(verbosity=2, stream=TestStream(m.__name__)).run(suite) - - if not result.wasSuccessful(): - r = False - _logger.error("Module %s: %d failures, %d errors", - module_name, len(result.failures), len(result.errors)) - current_test = None - return r - def runs_at(test, hook, default): # by default, tests do not run post install test_runs = getattr(test, hook, default) @@ -396,6 +372,30 @@ def runs_at(test, hook, default): runs_at_install = functools.partial(runs_at, hook='at_install', default=True) runs_post_install = functools.partial(runs_at, hook='post_install', default=False) +def run_unit_tests(module_name, dbname, position=runs_at_install): + """ + :returns: ``True`` if all of ``module_name``'s tests succeeded, ``False`` + if any of them failed. + :rtype: bool + """ + global current_test + current_test = module_name + mods = get_test_modules(module_name) + r = True + for m in mods: + tests = unwrap_suite(unittest2.TestLoader().loadTestsFromModule(m)) + suite = unittest2.TestSuite(itertools.ifilter(position, tests)) + _logger.info('running %s tests.', m.__name__) + + result = unittest2.TextTestRunner(verbosity=2, stream=TestStream(m.__name__)).run(suite) + + if not result.wasSuccessful(): + r = False + _logger.error("Module %s: %d failures, %d errors", + module_name, len(result.failures), len(result.errors)) + current_test = None + return r + def unwrap_suite(test): """ Attempts to unpack testsuites (holding suites or cases) in order to From c0a97887b467f88c0198c39c1a41bc0396ffdc19 Mon Sep 17 00:00:00 2001 From: "chm@openerp.com" <> Date: Tue, 18 Mar 2014 16:35:25 +0100 Subject: [PATCH 2/5] [WIP] rev me bzr revid: chm@openerp.com-20140318153525-uhimflitcgk16rlk --- openerp/http.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/openerp/http.py b/openerp/http.py index 438c8ec1cc0..178435cbfa4 100644 --- a/openerp/http.py +++ b/openerp/http.py @@ -216,6 +216,9 @@ class WebRequest(object): # The decorator can call us more than once if there is an database error. In this # case, the request cursor is unusable. Rollback transaction to create a new one. if self._cr: + print "" + print "rollback http.py checked_call" + print "" self._cr.rollback() return self.endpoint(*a, **kw) From 17956befd78277cb2494f901973643acd4cb620e Mon Sep 17 00:00:00 2001 From: "chm@openerp.com" <> Date: Tue, 18 Mar 2014 17:09:41 +0100 Subject: [PATCH 3/5] [FIX] do not rolback cursor in test mode bzr revid: chm@openerp.com-20140318160941-w4c8r15sl0vag0sa --- openerp/http.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/openerp/http.py b/openerp/http.py index 7bf10f7763e..0e6317d33d1 100644 --- a/openerp/http.py +++ b/openerp/http.py @@ -222,10 +222,7 @@ class WebRequest(object): def checked_call(___dbname, *a, **kw): # The decorator can call us more than once if there is an database error. In this # case, the request cursor is unusable. Rollback transaction to create a new one. - if self._cr: - print "" - print "rollback http.py checked_call" - print "" + if self._cr and not openerp.tools.config['test_enable']: self._cr.rollback() return self.endpoint(*a, **kw) From ea901ebb1de354f5bccc5cbcfb7ef478f5fa99eb Mon Sep 17 00:00:00 2001 From: "chm@openerp.com" <> Date: Wed, 19 Mar 2014 12:20:27 +0100 Subject: [PATCH 4/5] [FIX] phantomjs: don't use error method because it's undefined in phantomjs evaluating environment bzr revid: chm@openerp.com-20140319112027-buua40iyi7hgnlly --- openerp/tests/phantomtest.js | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/openerp/tests/phantomtest.js b/openerp/tests/phantomtest.js index 63a3b2e33ff..6957f741fd5 100644 --- a/openerp/tests/phantomtest.js +++ b/openerp/tests/phantomtest.js @@ -6,7 +6,8 @@ function waitFor (ready, callback, timeout, timeoutMessageCallback) { (function waitLoop() { if(new Date - start > timeout) { - error(timeoutMessageCallback ? timeoutMessageCallback() : "Timeout after "+timeout+" ms"); + console.log('error', timeoutMessageCallback ? timeoutMessageCallback() : "Timeout after "+timeout+" ms"); + phantom.exit(1); } else if (ready()) { callback(); } else { @@ -15,10 +16,6 @@ function waitFor (ready, callback, timeout, timeoutMessageCallback) { }()); } -function error(message) { - console.log('error', message); - phantom.exit(1); -} function PhantomTest() { var self = this; this.options = JSON.parse(phantom.args[phantom.args.length-1]); @@ -49,10 +46,12 @@ function PhantomTest() { })); msg.push('(leaf frame on top)') } - error(JSON.stringify(msg.join('\n'))); + console.log('error', JSON.stringify(msg.join('\n'))); + phantom.exit(1); }; this.page.onAlert = function(message) { - error(message); + console.log('error', message); + phantom.exit(1); }; this.page.onConsoleMessage = function(message) { console.log(message); @@ -78,7 +77,8 @@ function PhantomTest() { if(!found) { console.log('Injecting', src, 'needed for', need); if(!self.page.injectJs(src)) { - error("Cannot inject " + src); + console.log('error', "Cannot inject " + src); + phantom.exit(1); } } } @@ -89,7 +89,8 @@ function PhantomTest() { var message = ("Timeout\nhref: " + window.location.href + "\nreferrer: " + document.referrer + "\n\n" + document.body.innerHTML).replace(/[^a-z0-9\s~!@#$%^&*()_|+\-=?;:'",.<>\{\}\[\]\\\/]/gi, "*"); - error(message); + console.log('error', message); + phantom.exit(1); }); }, self.timeout); @@ -108,7 +109,8 @@ function PhantomTest() { var url = self.origin + url_path; self.page.open(url, function(status) { if (status !== 'success') { - error("failed to load " + url) + console.log('error', "failed to load " + url); + phantom.exit(1); } else { console.log('loaded', url, status); // process ready @@ -119,7 +121,7 @@ function PhantomTest() { try { console.log("page.evaluate eval expr:", ready); r = !!eval(ready); - } catch(ex) { + } catch(ex) { } console.log("page.evaluate eval result:", r); return r; From 82989d95f7c00cd2df8804e6328d1db9b7e653d6 Mon Sep 17 00:00:00 2001 From: "chm@openerp.com" <> Date: Tue, 25 Mar 2014 10:25:47 +0100 Subject: [PATCH 5/5] [FIX] phantomjs: hide error if document.body does not exists bzr revid: chm@openerp.com-20140325092547-ilnbqdj4rhdo0q3r --- openerp/tests/phantomtest.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openerp/tests/phantomtest.js b/openerp/tests/phantomtest.js index 6957f741fd5..5a6a9696cc0 100644 --- a/openerp/tests/phantomtest.js +++ b/openerp/tests/phantomtest.js @@ -88,7 +88,7 @@ function PhantomTest() { self.page.evaluate(function () { var message = ("Timeout\nhref: " + window.location.href + "\nreferrer: " + document.referrer - + "\n\n" + document.body.innerHTML).replace(/[^a-z0-9\s~!@#$%^&*()_|+\-=?;:'",.<>\{\}\[\]\\\/]/gi, "*"); + + "\n\n" + (document.body && document.body.innerHTML)).replace(/[^a-z0-9\s~!@#$%^&*()_|+\-=?;:'",.<>\{\}\[\]\\\/]/gi, "*"); console.log('error', message); phantom.exit(1); });