Hi Benjamin and Anibal See inline repsonse.
On 19.01.2017 18:53, Esquivel, Benjamin wrote: > Sure Anibal, see my response inline. > >> -----Original Message----- >> From: Aníbal Limón [mailto:anibal.li...@linux.intel.com] >> Sent: Thursday, January 19, 2017 11:42 AM >> To: Pascal Bach <pascal.b...@siemens.com>; yocto@yoctoproject.org; >> Christian Schuler <schuler.christ...@siemens.com>; Esquivel, Benjamin >> <benjamin.esqui...@intel.com> >> Subject: Re: [yocto] [ptest-runner][PATCH] feat: generate xml-file >> >> Hi Pascal and Christian, >> >> Your patch looks good at first look, only a few comments about the code >> inline. >> >> We are trying to standardize the results output format across our testing >> components in order to build up-on a Test reporting tool, so let us review >> the >> XML format. >> >> Benjamin do you have a wiki page link with test result format information? > https://wiki.yoctoproject.org/wiki/QA/xUnit_XML_Template Thanks, the current XML is just a minimal set but it should comply to the xUnit spec. But enhancements are of course welcome. >> Cheers, >> alimon >> >> On 01/19/2017 07:33 AM, Pascal Bach wrote: >>> From: Christian Schuler <schuler.christ...@siemens.com> >>> >>> add a feature that allows the user to generate an XUnit xml-file. >>> This file shows if the ptests run correctly or not. e.g. bash, zlib. >>> It doesn't list the underlaying tests of the package. >>> The feature is activated by console input -x <filepath>. >>> Unit-tests of the feature are included. >>> >>> Signed-off-by: Christian Schuler <schuler.christ...@siemens.com> >>> Signed-off-by: Pascal Bach <pascal.b...@siemens.com> >>> --- >>> README.md | 1 + >>> main.c | 15 +++++++++++---- >>> tests/utils.c | 46 +++++++++++++++++++++++++++++++++++++++++++-- >>> utils.c | 60 >> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- >>> utils.h | 7 ++++++- >>> 5 files changed, 121 insertions(+), 8 deletions(-) >>> >>> diff --git a/README.md b/README.md >>> index ed7a589..fedab04 100644 >>> --- a/README.md >>> +++ b/README.md >>> @@ -14,6 +14,7 @@ Now the ptest-runner2 support the next features: >>> - List available ptests. >>> - Specify the timeout for avoid blocking indefinetly. >>> - Only run certain ptests. >>> +- XML-ouput >>> >>> Proposed features: >>> >>> diff --git a/main.c b/main.c >>> index 31bf3b5..8dfdad6 100644 >>> --- a/main.c >>> +++ b/main.c >>> @@ -41,7 +41,7 @@ >>> static inline void >>> print_usage(FILE *stream, char *progname) { >>> - fprintf(stream, "Usage: %s [-d directory] [-l list] [-t timeout] " >>> + fprintf(stream, "Usage: %s [-d directory] [-l list] [-t timeout] [-x >>> xml- >> filename]" >>> "[-h] [ptest1 ptest2 ...]\n", progname); } >>> >>> @@ -50,6 +50,7 @@ static struct { >>> int list; >>> int timeout; >>> char **ptests; >>> + char * xml_filename; >>> } opts; >>> >>> int >>> @@ -70,8 +71,9 @@ main(int argc, char *argv[]) >>> opts.list = 0; >>> opts.timeout = DEFAULT_TIMEOUT; >>> opts.ptests = NULL; >>> + opts.xml_filename = NULL; >>> >>> - while ((opt = getopt(argc, argv, "d:lt:h")) != -1) { >>> + while ((opt = getopt(argc, argv, "d:ltx:h")) != -1) { >>> switch (opt) { >>> case 'd': >>> free(opts.directory); >>> @@ -88,6 +90,11 @@ main(int argc, char *argv[]) >>> print_usage(stdout, argv[0]); >>> exit(0); >>> break; >>> + case 'x': >>> + free(opts.xml_filename); >>> + opts.xml_filename = strdup(optarg); >>> + CHECK_ALLOCATION(opts.xml_filename, 1, >> 1); >>> + break; >>> default: >>> print_usage(stdout, argv[0]); >>> exit(1); >>> @@ -131,9 +138,9 @@ main(int argc, char *argv[]) >>> run = filter_ptests(head, opts.ptests, ptest_num); >>> CHECK_ALLOCATION(run, ptest_num, 1); >>> ptest_list_free_all(head); >>> - } >>> + } >>> >>> - rc = run_ptests(run, opts.timeout, argv[0], stdout, stderr); >>> + rc = run_ptests(run, opts.timeout, argv[0], stdout, stderr, >>> +opts.xml_filename); >> Will be a good idea modify the run_ptest signature to pass the whole options >> to it. >> >> I mean: >> >> run_ptests(run, opts, argv[0], stdout, stderr) >> >> If you could do a first patch with this change and then add your >> functionality >> realted to xml_filename will be good. >> >>> ptest_list_free_all(run); >>> >>> diff --git a/tests/utils.c b/tests/utils.c index 1332798..dd869e9 >>> 100644 >>> --- a/tests/utils.c >>> +++ b/tests/utils.c >>> @@ -173,7 +173,7 @@ START_TEST(test_run_ptests) >>> ptest_list_remove(head, "hang", 1); >>> ptest_list_remove(head, "fail", 1); >>> >>> - rc = run_ptests(head, timeout, "test_run_ptests", fp_stdout, >> fp_stderr); >>> + rc = run_ptests(head, timeout, "test_run_ptests", fp_stdout, >>> +fp_stderr, NULL); >>> ck_assert(rc == 0); >>> ptest_list_free_all(head); >>> >>> @@ -234,6 +234,46 @@ START_TEST(test_run_fail_ptest) >>> ptest_list_free_all(head); >>> END_TEST >>> >>> +START_TEST(test_xml_pass) >>> + char ref[] = "<?xml version='1.0' encoding='UTF-8'?>\n<testsuite >> name='ptests' tests='2'>\n" >>> + "<testcase name='.'>\n<nodes expected='/' >> result='/'>\n" >>> + "<nodes expected='0' result='0'>\n" >>> + "</nodes>\n" >>> + "</nodes>\n" >>> + "</testcase>\n" >>> + "<testcase name='.'>\n" >>> + "<nodes expected='/' result='/'>\n" >>> + "<nodes expected='0' result='1'>\n" >>> + "<error type='Timeout/Unexpected error'>\n" >>> + "A Timeout has occured or more tests than expected >> failed.\n" >>> + "</error>\n" >>> + "</nodes>\n" >>> + "</nodes>\n" >>> + "</testcase>\n" >>> + "</testsuite>"; >>> + char buffer[strlen(ref)]; >>> + >>> + FILE *fp; >>> + fp = xml_create(2, "./test_xml"); >>> + xml_add_case(fp, 0,"."); >>> + xml_add_case(fp, 1,"."); >>> + xml_finish(fp); >>> + >>> + fp = fopen("./test_xml", "a+"); >>> + fseek(fp, 0, SEEK_SET); >>> + >>> + fread(buffer, strlen(ref), 1, fp); >>> + ck_assert(strncmp(ref, buffer, strlen(ref)) == 0); >>> + fclose(fp); >>> + unlink("./test_xml"); >>> + >>> +END_TEST >>> + >>> +START_TEST(test_xml_fail) >>> + ck_assert(xml_create(2, "./") == NULL); >>> + >>> +END_TEST >>> + >>> Suite * >>> utils_suite() >>> { >>> @@ -249,6 +289,8 @@ utils_suite() >>> tcase_add_test(tc_core, test_run_ptests); >>> tcase_add_test(tc_core, test_run_timeout_ptest); >>> tcase_add_test(tc_core, test_run_fail_ptest); >>> + tcase_add_test(tc_core, test_xml_pass); >>> + tcase_add_test(tc_core, test_xml_fail); >>> >>> suite_add_tcase(s, tc_core); >>> >>> @@ -276,7 +318,7 @@ test_ptest_expected_failure(struct ptest_list >> *head, const int timeout, char *pr >>> ck_assert(ptest_list_length(filtered) == 1); >>> >>> h_analizer( >>> - run_ptests(filtered, timeout, progname, fp_stdout, >> fp_stderr), >>> + run_ptests(filtered, timeout, progname, fp_stdout, >> fp_stderr, >>> +NULL), >>> fp_stdout, fp_stderr >>> ); >>> >>> diff --git a/utils.c b/utils.c >>> index 77427e0..430fb7a 100644 >>> --- a/utils.c >>> +++ b/utils.c >>> @@ -303,9 +303,10 @@ wait_child(const char *ptest_dir, const char >>> *run_ptest, pid_t pid, >>> >>> int >>> run_ptests(struct ptest_list *head, int timeout, const char *progname, >>> - FILE *fp, FILE *fp_stderr) >>> + FILE *fp, FILE *fp_stderr, char *xml_filename) >>> { >>> int rc = 0; >>> + XML *xh; >>> >>> struct ptest_list *p; >>> char stime[GET_STIME_BUF_SIZE]; >>> @@ -314,6 +315,12 @@ run_ptests(struct ptest_list *head, int timeout, >> const char *progname, >>> int pipefd_stdout[2]; >>> int pipefd_stderr[2]; >>> >>> + if(xml_filename) { >>> + xh = xml_create(ptest_list_length(head), xml_filename); >>> + if(!xh) >>> + exit(EXIT_FAILURE); >>> + } >>> + >>> do >>> { >>> if ((rc = pipe2(pipefd_stdout, O_NONBLOCK)) == -1) @@ - >> 355,6 +362,9 >>> @@ run_ptests(struct ptest_list *head, int timeout, const char >> *progname, >>> fprintf(fp, "ERROR: Exit status is >> %d\n", status); >>> rc += 1; >>> } >>> + if (xml_filename) >>> + xml_add_case(xh, status, ptest_dir); >>> + >>> fprintf(fp, "END: %s\n", ptest_dir); >>> fprintf(fp, "%s\n", get_stime(stime, >> GET_STIME_BUF_SIZE)); >>> } >>> @@ -368,5 +378,53 @@ run_ptests(struct ptest_list *head, int timeout, >> const char *progname, >>> if (rc == -1) >>> fprintf(fp_stderr, "run_ptests fails: %s", strerror(errno)); >>> >>> + if (xml_filename) >>> + xml_finish(xh); >>> + >>> return rc; >>> } >>> + >>> +FILE * >>> +xml_create(int test_count, char *xml_filename) { >>> + FILE *xh; >>> + >>> + if ((xh = fopen(xml_filename, "w"))) { >>> + fprintf(xh, "<?xml version='1.0' encoding='UTF-8'?>\n"); >>> + fprintf(xh, "<testsuite name='ptests' tests='%d'>\n", >> test_count); >>> + } >>> + else { >>> + fprintf(stderr, "File could not be created. Make sure the path >> is correct and you have the right permissions."); >>> + return NULL; >>> + } >>> + >>> + return xh; >>> +} >>> + >>> +void >>> +xml_add_case(FILE *xh, int status, const char *ptest_dir) { >>> + fprintf(xh, "<testcase name='%s'>\n", ptest_dir); >>> + fprintf(xh, "<nodes expected='/' result='/'>\n"); >>> + >>> + if(status == 0){ >>> + fprintf(xh, "<nodes expected='0' result='0'>\n"); >>> + fprintf(xh, "</nodes>\n"); >>> + } >>> + else{ >>> + fprintf(xh, "<nodes expected='0' result='%d'>\n", status); >>> + fprintf(xh, "<error type='Timeout/Unexpected error'>\n"); >>> + fprintf(xh, "A Timeout has occured or more tests than >> expected failed.\n"); >>> + fprintf(xh, "</error>\n"); >>> + fprintf(xh, "</nodes>\n"); >>> + } >>> + fprintf(xh, "</nodes>\n"); >>> + fprintf(xh, "</testcase>\n"); >>> +} >>> + >>> +void >>> +xml_finish(FILE *xh) >>> +{ >>> + fprintf(xh, "</testsuite>"); >>> + fclose(xh); >>> +} >>> diff --git a/utils.h b/utils.h >>> index 4dc23ef..99f6100 100644 >>> --- a/utils.h >>> +++ b/utils.h >>> @@ -30,10 +30,15 @@ >>> #define CHECK_ALLOCATION(p, size, exit_on_null) \ >>> check_allocation1(p, size, __FILE__, __LINE__, exit_on_null) >>> >>> +typedef FILE XML; >>> + >>> extern void check_allocation1(void *, size_t, char *, int, int); >>> extern struct ptest_list *get_available_ptests(const char *); extern >>> int print_ptests(struct ptest_list *, FILE *); extern struct >>> ptest_list *filter_ptests(struct ptest_list *, char **, int); -extern >>> int run_ptests(struct ptest_list *, int, const char *progname, FILE *, >>> FILE *); >>> +extern int run_ptests(struct ptest_list *, int, const char *progname, >>> +FILE *, FILE *, char *xml_filename); extern XML * xml_create(int >>> +test_count, char *filename); extern void xml_add_case(XML *, int >>> +status, const char *ptest_dir); extern void xml_finish(XML *); >> I'm trying to follow BSD code-style so please remove variable names from >> prototypes. Also i make a mistake with progname that was before on the >> run_ptests prototype. We will do a rework of the patch that addresses the style issue. The XML we leave untouched for the moment. Pascal >> Also i don't wrote about code style into README, i will put a section into >> it, >> sorry for that. >> >> Best regards, >> alimon >> >>> #endif >>> -- _______________________________________________ yocto mailing list yocto@yoctoproject.org https://lists.yoctoproject.org/listinfo/yocto