]> git.ipfire.org Git - thirdparty/libsolv.git/commitdiff
Add solver reuse testcase
authorMichael Schroeder <mls@suse.de>
Tue, 30 May 2017 08:31:46 +0000 (10:31 +0200)
committerMichael Schroeder <mls@suse.de>
Tue, 30 May 2017 08:38:47 +0000 (10:38 +0200)
ext/testcase.c
ext/testcase.h
test/testcases/sat/reuse.t [new file with mode: 0644]
tools/testsolv.c

index 70d0b73c42148c1659f6ff084508f92b8e58aa4d..26acefa2a0c1a758fa3a7050e1f57248219b7e9a 100644 (file)
@@ -2272,7 +2272,7 @@ testcase_write_mangled(Solver *solv, const char *dir, int resultflags, const cha
       strqueue_push(&sq, cmd);
     }
 
-  if (resultflags)
+  if ((resultflags & ~TESTCASE_RESULT_REUSE_SOLVER) != 0)
     {
       char *result;
       cmd = 0;
@@ -2519,6 +2519,10 @@ testcase_read(Pool *pool, FILE *fp, const char *testcase, Queue *job, char **res
   int ngenid = 0;
   Queue autoinstq;
 
+  if (resultp)
+    *resultp = 0;
+  if (resultflagsp)
+    *resultflagsp = 0;
   if (!fp && !(fp = fopen(testcase, "r")))
     {
       pool_debug(pool, SOLV_ERROR, "testcase_read: could not open '%s'\n", testcase);
@@ -2799,8 +2803,10 @@ testcase_read(Pool *pool, FILE *fp, const char *testcase, Queue *job, char **res
          if (resultflagsp)
            *resultflagsp = resultflags;
        }
-      else if (!strcmp(pieces[0], "nextjob") && npieces == 1)
+      else if (!strcmp(pieces[0], "nextjob"))
        {
+         if (npieces == 2 && resultflagsp && !strcmp(pieces[1], "reusesolver"))
+           *resultflagsp |= TESTCASE_RESULT_REUSE_SOLVER;
          break;
        }
       else if (!strcmp(pieces[0], "disable") && npieces == 3)
index d3ad505c9f0f6df25ed9881430c2b2f403ac5861..341b9c29debea5c6e112f8fbafd413956a60a15b 100644 (file)
@@ -19,6 +19,9 @@
 #define TESTCASE_RESULT_GENID          (1 << 7)
 #define TESTCASE_RESULT_REASON         (1 << 8)
 
+/* reuse solver hack, testsolv use only */
+#define TESTCASE_RESULT_REUSE_SOLVER   (1 << 31)
+
 extern Id testcase_str2dep(Pool *pool, const char *s);
 extern const char *testcase_dep2str(Pool *pool, Id id);
 extern const char *testcase_repoid2str(Pool *pool, Id repoid);
diff --git a/test/testcases/sat/reuse.t b/test/testcases/sat/reuse.t
new file mode 100644 (file)
index 0000000..7abb266
--- /dev/null
@@ -0,0 +1,20 @@
+repo system 0 testtags <inline>
+#>=Pkg: X 1 1 x86_64
+repo available 0 testtags <inline>
+#>=Pkg: A 1 1 x86_64
+#>=Req: X
+#>=Pkg: B 1 1 x86_64
+job install name A
+result transaction,problems,rules <inline>
+#>install A-1-1.x86_64@available
+#>install X-1-1.x86_64@system
+#>rule job 300db6ce502dde94261e267a8c535441  A-1-1.x86_64@available
+#>rule pkg 11c27e407a56aad27bd6b3eadc17374b  X-1-1.x86_64@system
+#>rule pkg 11c27e407a56aad27bd6b3eadc17374b -A-1-1.x86_64@available
+nextjob reusesolver
+job install name B
+result transaction,problems,rules <inline>
+#>install B-1-1.x86_64@available
+#>rule job ad168c1819736b8aa6f507ab075b3494  B-1-1.x86_64@available
+#>rule pkg 11c27e407a56aad27bd6b3eadc17374b  X-1-1.x86_64@system
+#>rule pkg 11c27e407a56aad27bd6b3eadc17374b -A-1-1.x86_64@available
index d0328aeab1fe61dac13ae056385fd64f873b0907..d75124621e4b6a99a0290a0786be495190a6f437 100644 (file)
@@ -68,7 +68,7 @@ main(int argc, char **argv)
   Pool *pool;
   Queue job;
   Queue solq;
-  Solver *solv;
+  Solver *solv, *reusesolv = 0;
   char *result = 0;
   int resultflags = 0;
   int debuglevel = 0;
@@ -140,7 +140,12 @@ main(int argc, char **argv)
              pool_free(pool);
              exit(resultflags == 77 ? 77 : 1);
            }
-
+         if (reusesolv)
+           {
+             solver_free(solv);
+             solv = reusesolv;
+             reusesolv = 0;
+           }
          if (!multijob && !feof(fp))
            multijob = 1;
 
@@ -179,8 +184,8 @@ main(int argc, char **argv)
              solver_solve(solv, &job);
              solv->solution_callback = 0;
              solv->solution_callback_data = 0;
-             if (!resultflags)
-               resultflags = TESTCASE_RESULT_TRANSACTION | TESTCASE_RESULT_PROBLEMS;
+             if ((resultflags & ~TESTCASE_RESULT_REUSE_SOLVER) == 0)
+               resultflags |= TESTCASE_RESULT_TRANSACTION | TESTCASE_RESULT_PROBLEMS;
              myresult = testcase_solverresult(solv, resultflags);
              if (rescallback && reportsolutiondata.result)
                {
@@ -292,8 +297,13 @@ main(int argc, char **argv)
                }
            }
          queue_free(&job);
-         solver_free(solv);
+         if ((resultflags & TESTCASE_RESULT_REUSE_SOLVER) != 0 && !feof(fp))
+           reusesolv = solv;
+         else
+           solver_free(solv);
        }
+      if (reusesolv)
+       solver_free(reusesolv);
       pool_free(pool);
       fclose(fp);
     }