Mercurial > repos > bcclaywell > argo_navis
comparison venv/lib/python2.7/site-packages/planemo/galaxy_test/actions.py @ 0:d67268158946 draft
planemo upload commit a3f181f5f126803c654b3a66dd4e83a48f7e203b
| author | bcclaywell |
|---|---|
| date | Mon, 12 Oct 2015 17:43:33 -0400 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:d67268158946 |
|---|---|
| 1 import os | |
| 2 | |
| 3 import click | |
| 4 | |
| 5 from . import structures as test_structures | |
| 6 from planemo.io import info, warn | |
| 7 from planemo import galaxy_run | |
| 8 from planemo.reports import build_report | |
| 9 | |
| 10 | |
| 11 from galaxy.tools.deps.commands import shell | |
| 12 | |
| 13 XUNIT_UPGRADE_MESSAGE = ("This version of Galaxy does not support xUnit - " | |
| 14 "please update to newest development brach.") | |
| 15 NO_XUNIT_MESSAGE = ("Cannot locate xUnit report option for tests - update " | |
| 16 "Galaxy for more detailed breakdown.") | |
| 17 NO_JSON_MESSAGE = ("Cannot locate json report option for tests - update " | |
| 18 "Galaxy for more detailed breakdown.") | |
| 19 NO_TESTS_MESSAGE = "No tests were executed - see Galaxy output for details." | |
| 20 ALL_TESTS_PASSED_MESSAGE = "All %d test(s) executed passed." | |
| 21 PROBLEM_COUNT_MESSAGE = ("There were problems with %d test(s) - out of %d " | |
| 22 "test(s) executed. See %s for detailed breakdown.") | |
| 23 GENERIC_PROBLEMS_MESSAGE = ("One or more tests failed. See %s for detailed " | |
| 24 "breakdown.") | |
| 25 GENERIC_TESTS_PASSED_MESSAGE = "No failing tests encountered." | |
| 26 | |
| 27 | |
| 28 def run_in_config(ctx, config, **kwds): | |
| 29 config_directory = config.config_directory | |
| 30 html_report_file = kwds["test_output"] | |
| 31 | |
| 32 job_output_files = kwds.get("job_output_files", None) | |
| 33 if job_output_files is None: | |
| 34 job_output_files = os.path.join(config_directory, "jobfiles") | |
| 35 | |
| 36 xunit_supported, xunit_report_file = __xunit_state(kwds, config) | |
| 37 structured_report_file = __structured_report_file(kwds, config) | |
| 38 | |
| 39 info("Testing using galaxy_root %s", config.galaxy_root) | |
| 40 # TODO: Allow running dockerized Galaxy here instead. | |
| 41 server_ini = os.path.join(config_directory, "galaxy.ini") | |
| 42 config.env["GALAXY_CONFIG_FILE"] = server_ini | |
| 43 config.env["GALAXY_TEST_VERBOSE_ERRORS"] = "true" | |
| 44 config.env["GALAXY_TEST_SAVE"] = job_output_files | |
| 45 | |
| 46 cd_to_galaxy_command = "cd %s" % config.galaxy_root | |
| 47 test_cmd = test_structures.GalaxyTestCommand( | |
| 48 html_report_file, | |
| 49 xunit_report_file, | |
| 50 structured_report_file, | |
| 51 failed=kwds.get("failed", False), | |
| 52 installed=kwds.get("installed", False), | |
| 53 ).build() | |
| 54 cmd = "; ".join([ | |
| 55 cd_to_galaxy_command, | |
| 56 galaxy_run.ACTIVATE_COMMAND, # TODO: this should be moved to | |
| 57 # run_tests.sh to match run.sh. | |
| 58 test_cmd, | |
| 59 ]) | |
| 60 action = "Testing tools" | |
| 61 return_code = galaxy_run.run_galaxy_command( | |
| 62 ctx, | |
| 63 cmd, | |
| 64 config.env, | |
| 65 action | |
| 66 ) | |
| 67 if kwds.get('update_test_data', False): | |
| 68 update_cp_args = (job_output_files, config.test_data_dir) | |
| 69 shell('cp -r "%s"/* "%s"' % update_cp_args) | |
| 70 | |
| 71 if xunit_report_file and (not os.path.exists(xunit_report_file)): | |
| 72 warn(NO_XUNIT_MESSAGE) | |
| 73 xunit_report_file = None | |
| 74 | |
| 75 test_results = test_structures.GalaxyTestResults( | |
| 76 structured_report_file, | |
| 77 xunit_report_file, | |
| 78 html_report_file, | |
| 79 return_code, | |
| 80 ) | |
| 81 | |
| 82 try: | |
| 83 test_data = test_results.structured_data | |
| 84 | |
| 85 if 'test_output' in kwds: | |
| 86 with open(kwds['test_output'], 'w') as handle: | |
| 87 handle.write(build_report.build_report(test_data)) | |
| 88 | |
| 89 for kw_name in ('markdown', 'text'): | |
| 90 if 'test_output_%s' % kw_name in kwds: | |
| 91 with open(kwds['test_output_%s' % kw_name], 'w') as handle: | |
| 92 handle.write(build_report.build_report(test_data, report_type=kw_name)) | |
| 93 | |
| 94 except Exception: | |
| 95 pass | |
| 96 | |
| 97 __handle_summary( | |
| 98 test_results, | |
| 99 **kwds | |
| 100 ) | |
| 101 | |
| 102 return return_code | |
| 103 | |
| 104 | |
| 105 def __handle_summary( | |
| 106 test_results, | |
| 107 **kwds | |
| 108 ): | |
| 109 summary_style = kwds.get("summary") | |
| 110 if summary_style == "none": | |
| 111 return | |
| 112 | |
| 113 if test_results.has_details: | |
| 114 __summarize_tests_full( | |
| 115 test_results, | |
| 116 **kwds | |
| 117 ) | |
| 118 else: | |
| 119 if test_results.exit_code: | |
| 120 warn(GENERIC_PROBLEMS_MESSAGE % test_results.output_html_path) | |
| 121 else: | |
| 122 info(GENERIC_TESTS_PASSED_MESSAGE) | |
| 123 | |
| 124 | |
| 125 def __summarize_tests_full( | |
| 126 test_results, | |
| 127 **kwds | |
| 128 ): | |
| 129 num_tests = test_results.num_tests | |
| 130 num_problems = test_results.num_problems | |
| 131 | |
| 132 if num_tests == 0: | |
| 133 warn(NO_TESTS_MESSAGE) | |
| 134 return | |
| 135 | |
| 136 if num_problems == 0: | |
| 137 info(ALL_TESTS_PASSED_MESSAGE % num_tests) | |
| 138 | |
| 139 if num_problems: | |
| 140 html_report_file = test_results.output_html_path | |
| 141 message_args = (num_problems, num_tests, html_report_file) | |
| 142 message = PROBLEM_COUNT_MESSAGE % message_args | |
| 143 warn(message) | |
| 144 | |
| 145 for testcase_el in test_results.xunit_testcase_elements: | |
| 146 structured_data_tests = test_results.structured_data_tests | |
| 147 __summarize_test_case(structured_data_tests, testcase_el, **kwds) | |
| 148 | |
| 149 | |
| 150 def __summarize_test_case(structured_data, testcase_el, **kwds): | |
| 151 summary_style = kwds.get("summary") | |
| 152 test_id = test_structures.case_id(testcase_el) | |
| 153 passed = len(list(testcase_el)) == 0 | |
| 154 if not passed: | |
| 155 state = click.style("failed", bold=True, fg='red') | |
| 156 else: | |
| 157 state = click.style("passed", bold=True, fg='green') | |
| 158 click.echo(test_id.label + ": " + state) | |
| 159 if summary_style != "minimal": | |
| 160 __print_command_line(structured_data, test_id) | |
| 161 | |
| 162 | |
| 163 def __print_command_line(structured_data, test_id): | |
| 164 try: | |
| 165 test = [d for d in structured_data if d["id"] == test_id.id][0]["data"] | |
| 166 except (KeyError, IndexError): | |
| 167 # Failed to find structured data for this test - likely targetting | |
| 168 # and older Galaxy version. | |
| 169 return | |
| 170 | |
| 171 execution_problem = test.get("execution_problem", None) | |
| 172 if execution_problem: | |
| 173 click.echo("| command: *could not execute job, no command generated* ") | |
| 174 return | |
| 175 | |
| 176 try: | |
| 177 command = test["job"]["command_line"] | |
| 178 except (KeyError, IndexError): | |
| 179 click.echo("| command: *failed to determine command for job* ") | |
| 180 return | |
| 181 | |
| 182 click.echo("| command: %s" % command) | |
| 183 | |
| 184 | |
| 185 def __xunit_state(kwds, config): | |
| 186 xunit_supported = True | |
| 187 if shell("grep -q xunit '%s'/run_tests.sh" % config.galaxy_root): | |
| 188 xunit_supported = False | |
| 189 | |
| 190 xunit_report_file = kwds.get("test_output_xunit", None) | |
| 191 if xunit_report_file is None and xunit_supported: | |
| 192 xunit_report_file = os.path.join(config.config_directory, "xunit.xml") | |
| 193 elif xunit_report_file is not None and not xunit_supported: | |
| 194 warn(XUNIT_UPGRADE_MESSAGE) | |
| 195 xunit_report_file = None | |
| 196 | |
| 197 return xunit_supported, xunit_report_file | |
| 198 | |
| 199 | |
| 200 def __structured_report_file(kwds, config): | |
| 201 structured_data_supported = True | |
| 202 if shell("grep -q structured_data '%s'/run_tests.sh" % config.galaxy_root): | |
| 203 structured_data_supported = False | |
| 204 | |
| 205 structured_report_file = None | |
| 206 structured_report_file = kwds.get("test_output_json", None) | |
| 207 if structured_report_file is None and structured_data_supported: | |
| 208 conf_dir = config.config_directory | |
| 209 structured_report_file = os.path.join(conf_dir, "structured_data.json") | |
| 210 elif structured_report_file is not None and not structured_data_supported: | |
| 211 warn(NO_JSON_MESSAGE) | |
| 212 structured_report_file = None | |
| 213 | |
| 214 return structured_report_file |
