summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Schroeder <mls@suse.de>2014-06-24 13:41:26 +0200
committerMichael Schroeder <mls@suse.de>2014-06-24 13:41:26 +0200
commitc56bef07b2db954ae09d1d2817336ffb9eb537b1 (patch)
tree78b07663f969d90fcff2556fcd183a08c07d3486
parent04b192f26d73bd4394451b2b9faacad3c11d5163 (diff)
downloadlibsolv-c56bef07b2db954ae09d1d2817336ffb9eb537b1.tar.gz
libsolv-c56bef07b2db954ae09d1d2817336ffb9eb537b1.tar.bz2
libsolv-c56bef07b2db954ae09d1d2817336ffb9eb537b1.zip
add '-m' option to test the solution callback
-rw-r--r--tools/testsolv.c52
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)