123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149(**************************************************************************)(* The OUnit library *)(* *)(* Copyright (C) 2002-2008 Maas-Maarten Zeeman. *)(* Copyright (C) 2010 OCamlCore SARL *)(* Copyright (C) 2013 Sylvain Le Gall *)(* *)(* The package OUnit is copyright by Maas-Maarten Zeeman, OCamlCore SARL *)(* and Sylvain Le Gall. *)(* *)(* Permission is hereby granted, free of charge, to any person obtaining *)(* a copy of this document and the OUnit software ("the Software"), to *)(* deal in the Software without restriction, including without limitation *)(* the rights to use, copy, modify, merge, publish, distribute, *)(* sublicense, and/or sell copies of the Software, and to permit persons *)(* to whom the Software is furnished to do so, subject to the following *)(* conditions: *)(* *)(* The above copyright notice and this permission notice shall be *)(* included in all copies or substantial portions of the Software. *)(* *)(* The Software is provided ``as is'', without warranty of any kind, *)(* express or implied, including but not limited to the warranties of *)(* merchantability, fitness for a particular purpose and noninfringement. *)(* In no event shall Maas-Maarten Zeeman be liable for any claim, damages *)(* or other liability, whether in an action of contract, tort or *)(* otherwise, arising from, out of or in connection with the Software or *)(* the use or other dealings in the software. *)(* *)(* See LICENSE.txt for details. *)(**************************************************************************)(*
JUnit logger for OUnit.
*)openOUnitLoggeropenOUnitUtilsopenOUnitTestopenOUnitResultSummaryletxml_escaper=OUnitLoggerHTML.html_escaperletrenderconffnevents=letsmr=OUnitResultSummary.of_log_eventsconfeventsinletchn=open_outfninletstring_of_failure=function|msg,None->msg^"\nNo backtrace."|msg,Somebacktrace->msg^"\n"^backtraceinletprintffmt=Printf.fprintfchnfmtinprintf"\
<?xml version='1.0' encoding='%s'?>
<testsuites>
<testsuite
id='0'
package='%s'
name='%s'
timestamp='%s'
hostname='%s'
tests='%d'
failures='%d'
errors='%d'
time='%f'>\n"smr.charset(xml_escapersmr.suite_name)(xml_escapersmr.suite_name)(xml_escaper(date_iso8601~tz:falsesmr.start_at))(xml_escaper(fqdn()))smr.test_case_count(smr.failures+smr.todos)smr.errorssmr.running_time;printf"\
\ <properties>\n";List.iter(fun(k,v)->printf"\
\ <property name='%s' value='%s' />\n"(xml_escaperk)(xml_escaperv))smr.conf;printf"\
\ </properties>\n";List.iter(funtest_data->printf"\
\ <testcase name='%s' classname='%s' time='%f'>\n"(xml_escapertest_data.test_name)(xml_escapertest_data.test_name)(test_data.timestamp_end-.test_data.timestamp_start);beginmatchtest_data.test_resultwith|RSuccess|RSkip_->()|RError(msg,backtrace)->printf"\
\ <error type='OUnit.Error' message='%s'>%s</error>\n"(xml_escapermsg)(xml_escaper(string_of_failure(msg,backtrace)))|RFailure(msg,_,backtrace)->printf"\
\ <failure type='OUnit.Failure' message='%s'>%s</failure>\n"(xml_escapermsg)(xml_escaper(string_of_failure(msg,backtrace)))|RTodomsg->printf"\
\ <failure type='OUnit.Todo' message='%s'></failure>\n"(xml_escapermsg)|RTimeouttest_length->printf"\
\ <error type='OUnit.Timeout' message='timeout after %.1fs'></error>\n"(delay_of_lengthtest_length)end;printf"\
\ </testcase>\n")smr.tests;printf"\
\ <system-out>\n";List.iter(funlog_event->List.iter(funs->printf"%s\n"(xml_escapers))(OUnitLoggerStd.format_log_eventlog_event))events;printf"\
\ </system-out>
<system-err />
</testsuite>
</testsuites>
";close_outchnletoutput_junit_file=OUnitConf.make_string_subst_opt"output_junit_file"None"Output file for JUnit."letcreateconf=matchoutput_junit_fileconfwith|Somefn->post_logger(renderconffn)|None->null_logger