PROJECT_MOVED -> https://lab.nexedi.com/nexedi/erp5
[erp5.git] / product / ERP5Type / tests / runTestSuite.py
1 #!/usr/bin/env python2.7
2 import argparse, sys
3 from erp5.util import taskdistribution
4
5 # XXX: This import is required, just to populate sys.modules['test_suite'].
6 # Even if it's not used in this file. Yuck.
7 import ERP5TypeTestSuite
8
9 def _parsingErrorHandler(data, _):
10 print >> sys.stderr, 'Error parsing data:', repr(data)
11 taskdistribution.patchRPCParser(_parsingErrorHandler)
12
13 def makeSuite(node_quantity=None, test_suite=None, revision=None,
14 db_list=None, **kwargs):
15 # BBB tests (plural form) is only checked for backward compatibility
16 for k in sys.modules.keys():
17 if k in ('tests', 'test',) or k.startswith('tests.') or k.startswith('test.'):
18 del sys.modules[k]
19 singular_succeed = True
20 while True:
21 module_name, class_name = ('%s.%s' % (singular_succeed and 'test' or 'tests',
22 test_suite)).rsplit('.', 1)
23 try:
24 suite_class = getattr(__import__(module_name, None, None, [class_name]),
25 class_name)
26 except (AttributeError, ImportError):
27 if not singular_succeed:
28 raise
29 singular_succeed = False
30 else:
31 break
32 suite = suite_class(revision=revision,
33 max_instance_count=node_quantity,
34 mysql_db_list=db_list.split(','),
35 **kwargs)
36 return suite
37
38 def main():
39 parser = argparse.ArgumentParser(description='Run a test suite.')
40 parser.add_argument('--test_suite', help='The test suite name')
41 parser.add_argument('--test_suite_title', help='The test suite title',
42 default=None)
43 parser.add_argument('--test_node_title', help='The test node title',
44 default=None)
45 parser.add_argument('--project_title', help='The project title',
46 default=None)
47 parser.add_argument('--revision', help='The revision to test',
48 default='dummy_revision')
49 parser.add_argument('--node_quantity', help='Number of parallel tests to run',
50 default=1, type=int)
51 parser.add_argument('--master_url',
52 help='The Url of Master controling many suites',
53 default=None)
54 parser.add_argument('--db_list', help='A list of sql connection strings')
55 # parameters that needs to be passed to runUnitTest
56 parser.add_argument('--conversion_server_hostname', default=None)
57 parser.add_argument('--conversion_server_port', default=None)
58 parser.add_argument('--volatile_memcached_server_hostname', default=None)
59 parser.add_argument('--volatile_memcached_server_port', default=None)
60 parser.add_argument('--persistent_memcached_server_hostname', default=None)
61 parser.add_argument('--persistent_memcached_server_port', default=None)
62 parser.add_argument('--bt5_path', default=None)
63 parser.add_argument("--xvfb_bin", default=None)
64 parser.add_argument("--firefox_bin", default=None)
65
66 args = parser.parse_args()
67 if args.bt5_path is not None:
68 sys.path[0:0] = args.bt5_path.split(",")
69 master = taskdistribution.TaskDistributionTool(args.master_url)
70 test_suite_title = args.test_suite_title or args.test_suite
71 revision = args.revision
72 suite = makeSuite(test_suite=args.test_suite,
73 node_quantity=args.node_quantity,
74 revision=revision,
75 db_list=args.db_list,
76 bt5_path=args.bt5_path,
77 firefox_bin=args.firefox_bin,
78 xvfb_bin=args.xvfb_bin)
79 test_result = master.createTestResult(revision, suite.getTestList(),
80 args.test_node_title, suite.allow_restart, test_suite_title,
81 args.project_title)
82 if test_result is not None:
83 assert revision == test_result.revision, (revision, test_result.revision)
84 while suite.acquire():
85 test = test_result.start(suite.running.keys())
86 if test is not None:
87 suite.start(test.name, lambda status_dict, __test=test:
88 __test.stop(**status_dict))
89 elif not suite.running:
90 break