diff options
author | Michael Schroeder <mls@suse.de> | 2014-06-24 13:41:26 +0200 |
---|---|---|
committer | Michael Schroeder <mls@suse.de> | 2014-06-24 13:41:26 +0200 |
commit | c56bef07b2db954ae09d1d2817336ffb9eb537b1 (patch) | |
tree | 78b07663f969d90fcff2556fcd183a08c07d3486 | |
parent | 04b192f26d73bd4394451b2b9faacad3c11d5163 (diff) | |
download | libsolv-c56bef07b2db954ae09d1d2817336ffb9eb537b1.tar.gz libsolv-c56bef07b2db954ae09d1d2817336ffb9eb537b1.tar.bz2 libsolv-c56bef07b2db954ae09d1d2817336ffb9eb537b1.zip |
add '-m' option to test the solution callback
-rw-r--r-- | tools/testsolv.c | 52 |
1 files changed, 51 insertions, 1 deletions
diff --git a/tools/testsolv.c b/tools/testsolv.c index 6793085..34f393b 100644 --- a/tools/testsolv.c +++ b/tools/testsolv.c @@ -28,6 +28,37 @@ usage(ex) exit(ex); } +struct reportsolutiondata { + int count; + char *result; +}; + +static int +reportsolutioncb(Solver *solv, void *cbdata) +{ + struct reportsolutiondata *sd = cbdata; + char *res; + + sd->count++; + res = testcase_solverresult(solv, TESTCASE_RESULT_TRANSACTION); + if (*res) + { + char prefix[64]; + char *p2, *p = res; + sprintf(prefix, "callback%d:", sd->count); + while ((p2 = strchr(p, '\n')) != 0) + { + char c = p2[1]; + p2[1] = 0; + sd->result = solv_dupappend(sd->result, prefix, p); + p2[1] = c; + p = p2 + 1; + } + } + solv_free(res); + return 0; +} + int main(int argc, char **argv) { @@ -40,6 +71,7 @@ main(int argc, char **argv) int debuglevel = 0; int writeresult = 0; int multijob = 0; + int rescallback = 0; int c; int ex = 0; const char *list = 0; @@ -47,7 +79,7 @@ main(int argc, char **argv) const char *p; queue_init(&solq); - while ((c = getopt(argc, argv, "vrhl:s:")) >= 0) + while ((c = getopt(argc, argv, "vmrhl:s:")) >= 0) { switch (c) { @@ -57,6 +89,9 @@ main(int argc, char **argv) case 'r': writeresult++; break; + case 'm': + rescallback = 1; + break; case 'h': usage(0); break; @@ -124,10 +159,25 @@ main(int argc, char **argv) else if (result || writeresult) { char *myresult, *resultdiff; + struct reportsolutiondata reportsolutiondata; + memset(&reportsolutiondata, 0, sizeof(reportsolutiondata)); + if (rescallback) + { + solv->solution_callback = reportsolutioncb; + solv->solution_callback_data = &reportsolutiondata; + } solver_solve(solv, &job); + solv->solution_callback = 0; + solv->solution_callback_data = 0; if (!resultflags) resultflags = TESTCASE_RESULT_TRANSACTION | TESTCASE_RESULT_PROBLEMS; myresult = testcase_solverresult(solv, resultflags); + if (rescallback && reportsolutiondata.result) + { + reportsolutiondata.result = solv_dupjoin(reportsolutiondata.result, myresult, 0); + solv_free(myresult); + myresult = reportsolutiondata.result; + } if (writeresult) { if (*myresult) |