redo test framework, with tests taken from yum sources
authorDan Winship <danw@gnome.org>
Fri, 15 Feb 2008 20:09:37 +0000 (15:09 -0500)
committerDan Winship <danw@gnome.org>
Fri, 15 Feb 2008 20:09:37 +0000 (15:09 -0500)
(none of them pass yet...)

sets.xml [deleted file]
test-driver.c
test.xml

diff --git a/sets.xml b/sets.xml
deleted file mode 100644 (file)
index 88bc376..0000000
--- a/sets.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<test-sets>
-
-  <set name="b">
-    <package name="bash" version="3.2-18.fc8">
-      <requires name="libc.so.6"/>
-      <requires name="config(bash)" eq="3.2-18.fc8"/>
-      <provides name="bash" eq="3.2-18.fc8"/>
-      <file name="/bin"/>
-      <file name="/bin/bash"/>
-    </package>
-  </set>
-
-  <set name="c">
-    <package name="nss" version="1.8-fc10">
-      <provides name="nss" eq="1.8-fc10"/>
-      <file name="/bin/nss"/>
-    </package>
-
-    <package name="x" version="2">
-      <conflicts name="y" eq="1.1"/>
-    </package>
-  </set>
-
-</test-sets>
index 5fbdc40..7857807 100644 (file)
@@ -50,17 +50,16 @@ parse_xml_file(const char *filename,
        close(fd);
 }
 
-struct test_set {
-       char *name;
-       struct razor_set *set;
-       struct test_set *next;
-};
-
 struct test_context {
+       struct razor_set *system_set, *repo_set, *result_set;
+
        struct razor_importer *importer;
-       struct test_set *sets;
-       struct razor_package_iterator *package_iterator;
-       struct razor_property_iterator *property_iterator;
+       struct razor_set **importer_set;
+
+       char *install_pkgs[3], *remove_pkgs[3];
+       int n_install_pkgs, n_remove_pkgs;
+
+       int in_result, result_errors;
 };
 
 static void
@@ -82,234 +81,267 @@ get_atts(const char **atts, ...)
        va_end(ap);
 }
 
-static void
-parse_property(struct test_context *ctx, const char **atts,
-              enum razor_property_type type)
+static enum razor_version_relation
+parse_relation (const char *rel_str)
 {
-       const char *name = NULL, *version = NULL;
+       if (!rel_str)
+               return -1;
+       if (rel_str[0] == 'l')
+               return rel_str[1] == 'e' ? RAZOR_VERSION_LESS_OR_EQUAL : RAZOR_VERSION_LESS;
+       else if (rel_str[0] == 'g')
+               return rel_str[1] == 'e' ? RAZOR_VERSION_GREATER_OR_EQUAL : RAZOR_VERSION_GREATER;
+       else if (rel_str[0] == 'e' || rel_str[1] == 'q')
+               return RAZOR_VERSION_EQUAL;
+       else
+               return -1;
+}
 
-       get_atts(atts, "name", &name, "eq", &version, NULL);
+static void
+start_test(struct test_context *ctx, const char **atts)
+{
+       const char *name = NULL;
 
-       if (name == NULL) {
-               fprintf(stderr, "no name specified for property\n");
-               exit(-1);
+       get_atts(atts, "name", &name, NULL);
+       if (!name) {
+               fprintf(stderr, "Test with no name\n");
+               exit(1);
        }
-       
-       razor_importer_add_property(ctx->importer, name,
-                                   RAZOR_VERSION_EQUAL, version, type);
+       printf("%s\n", name);
 }
 
 static void
-start_set_element(void *data, const char *element, const char **atts)
+end_test(struct test_context *ctx)
 {
-       struct test_context *ctx = data;
-       struct test_set *set;
-       const char *name, *version;
-
-       if (strcmp(element, "set") == 0) {
-               get_atts(atts, "name", &name, NULL);
-               ctx->importer = razor_importer_new();   
-               set = malloc(sizeof *set);
-               set->name = strdup(name);
-               set->next = ctx->sets;
-               ctx->sets = set;
-       } else if (strcmp(element, "package") == 0) {
-               get_atts(atts, "name", &name, "version", &version, NULL);
-               razor_importer_begin_package(ctx->importer, name, version);
-       } else if (strcmp(element, "requires") == 0) {
-               parse_property(ctx, atts, RAZOR_PROPERTY_REQUIRES);
-       } else if (strcmp(element, "provides") == 0) {
-               parse_property(ctx, atts, RAZOR_PROPERTY_PROVIDES);
-       } else if (strcmp(element, "obsoletes") == 0) {
-               parse_property(ctx, atts, RAZOR_PROPERTY_OBSOLETES);
-       } else if (strcmp(element, "conflicts") == 0) {
-               parse_property(ctx, atts, RAZOR_PROPERTY_CONFLICTS);
-       } else if (strcmp(element, "file") == 0) {
-               get_atts(atts, "name", &name, NULL);
-               razor_importer_add_file(ctx->importer, name);           
-       } else if (strcmp(element, "dir") == 0) {
-               get_atts(atts, "name", &name, NULL);
-               razor_importer_add_file(ctx->importer, name);           
+       if (ctx->system_set) {
+               razor_set_destroy(ctx->system_set);
+               ctx->system_set = NULL;
+       }
+       if (ctx->repo_set) {
+               razor_set_destroy(ctx->repo_set);
+               ctx->repo_set = NULL;
+       }
+       if (ctx->result_set) {
+               razor_set_destroy(ctx->result_set);
+               ctx->result_set = NULL;
        }
 }
 
 static void
-end_set_element (void *data, const char *name)
+start_set(struct test_context *ctx, const char **atts)
 {
-       struct test_context *ctx = data;
-
-       if (strcmp(name, "set") == 0) {
-               ctx->sets->set = razor_importer_finish(ctx->importer);
-       } else if (strcmp(name, "package") == 0) {
-               razor_importer_finish_package(ctx->importer);
+       const char *name = NULL;
+
+       ctx->importer = razor_importer_new();
+       get_atts(atts, "name", &name, NULL);
+       if (!name)
+               ctx->importer_set = &ctx->result_set;
+       else if (!strcmp(name, "system"))
+               ctx->importer_set = &ctx->system_set;
+       else if (!strcmp(name, "repo"))
+               ctx->importer_set = &ctx->repo_set;
+       else {
+               fprintf(stderr, "  bad set name '%s'\n", name);
+               exit(1);
        }
 }
 
-static struct razor_set *
-lookup_set(struct test_context *ctx, const char *name)
+static void
+end_set(struct test_context *ctx)
 {
-       struct test_set *set;
+       *ctx->importer_set = razor_importer_finish(ctx->importer);
+       ctx->importer = NULL;
+}
 
-       for (set = ctx->sets; set != NULL; set = set->next) {
-               if (strcmp(set->name, name) == 0)
-                       return set->set;
+static void
+start_package(struct test_context *ctx, const char **atts)
+{
+       const char *name = NULL, *version = NULL, *arch = NULL;
+
+       get_atts(atts, "name", &name, "version", &version, "arch", &arch, NULL);
+       if (!name) {
+               fprintf(stderr, "  package with no name\n");
+               exit(1);
        }
 
-       return NULL;
+       razor_importer_begin_package(ctx->importer, name, version);
+       razor_importer_add_property(ctx->importer, name,
+                                   RAZOR_VERSION_EQUAL, version,
+                                   RAZOR_PROPERTY_PROVIDES);
 }
 
 static void
-verify_begin(struct test_context *ctx, const char **atts)
+end_package(struct test_context *ctx)
 {
-       struct razor_set *set;
-       const char *type, *name;
+       razor_importer_finish_package(ctx->importer);
+}
 
-       get_atts(atts, "type", &type, "set", &name, NULL);
-       set = lookup_set(ctx, name);
-       if (set == NULL) {
-               fprintf(stderr, "set %s not found\n", name);
-               exit(-1);
-       }
+static void
+start_property(struct test_context *ctx, enum razor_property_type type, const char **atts)
+{
+       const char *name = NULL, *rel_str = NULL, *version = NULL;
+       enum razor_version_relation rel;
 
-       if (strcmp(type, "packages") == 0) {
-               ctx->package_iterator =
-                       razor_package_iterator_create(set);
-       } else if (strcmp(type, "properties") == 0) {
-               ctx->property_iterator =
-                       razor_property_iterator_create(set, NULL);
-       } else {
-               fprintf(stderr,
-                       "unknown compare type \"%s\"\n", type);
-               exit(-1);
+       get_atts(atts, "name", &name, "rel", &rel_str, "version", &version, NULL);
+       if (name == NULL) {
+               fprintf(stderr, "  no name specified for property\n");
+               exit(1);
        }
+       if (version) {
+               rel = parse_relation(rel_str);
+               if (rel == -1) {
+                       fprintf(stderr, "  bad or missing version relation for property %s\n", name);
+                       exit(1);
+               }
+       } else
+               rel = RAZOR_VERSION_EQUAL;
+       
+       razor_importer_add_property(ctx->importer, name,
+                                   rel, version, type);
 }
 
 static void
-verify_end(struct test_context *ctx)
+start_transaction(struct test_context *ctx, const char **atts)
 {
-       struct razor_package *package;
-       struct razor_property *property;
-       const char *name, *version;
-       enum razor_property_type type;
-       enum razor_version_relation relation;
-
-       if (ctx->package_iterator != NULL) {
-               if (razor_package_iterator_next(ctx->package_iterator,
-                                               &package,
-                                               &name, &version)) {
-                       fprintf(stderr, "too few packages in set\n");
-                       exit(-1);
-               }
-                               
-               razor_package_iterator_destroy(ctx->package_iterator);
-               ctx->package_iterator = NULL;
-       }
+       ctx->n_install_pkgs = 0;
+       ctx->n_remove_pkgs = 0;
+}
 
-       if (ctx->property_iterator != NULL) {
-               if (razor_property_iterator_next(ctx->property_iterator,
-                                                &property,
-                                                &name, &relation, &version,
-                                                &type)) {
-                       fprintf(stderr, "too few properties in set\n");
-                       exit(-1);
-               }
+static void
+end_transaction(struct test_context *ctx)
+{
+       /* FIXME: removes */
+       ctx->system_set = razor_set_update(ctx->system_set,
+                                          ctx->repo_set,
+                                          ctx->n_install_pkgs,
+                                          (const char **)ctx->install_pkgs);
+
+       while (ctx->n_install_pkgs--)
+               free(ctx->install_pkgs[ctx->n_install_pkgs]);
+       while (ctx->n_remove_pkgs--)
+               free(ctx->remove_pkgs[ctx->n_remove_pkgs]);
+}
 
-               razor_property_iterator_destroy(ctx->property_iterator);
-               ctx->property_iterator = NULL;
+static void
+start_install_or_update(struct test_context *ctx, const char **atts)
+{
+       const char *name = NULL;
+
+       get_atts(atts, "name", &name, NULL);
+       if (!name) {
+               fprintf(stderr, "  install/update with no name\n");
+               exit(1);
        }
+
+       ctx->install_pkgs[ctx->n_install_pkgs++] = strdup(name);
 }
 
 static void
-verify_package(struct test_context *ctx, const char **atts)
+start_remove(struct test_context *ctx, const char **atts)
 {
-       struct razor_package *package;
-       const char *name, *version, *ref_name, *ref_version;
+       const char *name = NULL;
 
-       if (ctx->package_iterator == NULL) {
-               fprintf(stderr,
-                       "\"package\" element seen, "
-                       "but not in package verify mode\n");
-               exit(-1);
+       get_atts(atts, "name", &name, NULL);
+       if (!name) {
+               fprintf(stderr, "  remove with no name\n");
+               exit(1);
        }
 
-       get_atts(atts, "name", &ref_name, "version", &ref_version, NULL);
-       if (!razor_package_iterator_next(ctx->package_iterator,
-                                        &package, &name, &version)) {
-               fprintf(stderr, "too many packages in set\n");
-               exit(-1);
-       }
-                       
-       if (strcmp(name, ref_name) != 0 || strcmp(version, ref_version) != 0) {
-               fprintf(stderr,
-                       "package mismatch; expected %s-%s, got %s-%s\n",
-                       ref_name, ref_version, name, version);
-               exit(-1);
-       }
+       ctx->remove_pkgs[ctx->n_remove_pkgs++] = strdup(name);
 }
 
 static void
-verify_property(struct test_context *ctx,
-               enum razor_property_type ref_type, const char **atts)
+start_result(struct test_context *ctx, const char **atts)
 {
-       struct razor_property *property;
-       const char *name, *version, *ref_name, *ref_version;
-       enum razor_property_type type;
-       enum razor_version_relation relation;
-       int same_version;
-
-       if (ctx->property_iterator == NULL) {
-               fprintf(stderr,
-                       "\"requires/provides\" element seen, "
-                       "but not in property verify mode\n");
-               exit(-1);
+       ctx->in_result = 1;
+}
+
+static void
+diff_callback(const char *name,
+             const char *old_version, const char *new_version,
+             void *data)
+{
+       struct test_context *ctx = data;
+
+       ctx->result_errors++;
+       if (old_version) {
+               fprintf(stderr, "  result set should not contain %s %s\n",
+                       name, old_version);
+       } else {
+               fprintf(stderr, "  result set should contain %s %s\n",
+                       name, new_version);
        }
+}
 
-       get_atts(atts, "name", &ref_name, "eq", &ref_version, NULL);
-       if (!razor_property_iterator_next(ctx->property_iterator, &property,
-                                         &name, &relation, &version, &type)) {
-               fprintf(stderr, "too many properties in set\n");
-               exit(-1);
+static void
+end_result(struct test_context *ctx)
+{
+       ctx->in_result = 0;
+
+       /* FIXME */
+       if (ctx->n_remove_pkgs) {
+               printf ("  (ignoring because of unimplemented remove)\n");
+               return;
        }
-                       
-       if (version != NULL && ref_version != NULL)
-               same_version = strcmp(version, ref_version) == 0;
-       else if (version == NULL && ref_version == NULL)
-               same_version = 1;
-       else
-               same_version = 0;
 
-       if (strcmp(name, ref_name) != 0 || !same_version || type != ref_type) {
-               fprintf(stderr,
-                       "property mismatch; expected %s-%s/%d, got %s-%s/%d\n",
-                       ref_name, ref_version, ref_type,
-                       name, version, type);
-               exit(-1);
+       if (ctx->system_set && ctx->result_set) {
+               ctx->result_errors = 0;
+               razor_set_diff(ctx->system_set, ctx->result_set,
+                              diff_callback, ctx);
+               if (ctx->result_errors)
+                       exit(1);
        }
+
+}
+
+static void
+start_unsatisfied(struct test_context *ctx, const char **atts)
+{
+       /* FIXME */
+       fprintf(stderr, "Can't handle <unsatisfied>\n");
+       exit(1);
+}
+
+static void
+end_unsatisfied(struct test_context *ctx)
+{
 }
 
 static void
 start_test_element(void *data, const char *element, const char **atts)
 {
        struct test_context *ctx = data;
-       const char *name;
-
-       if (strcmp(element, "import") == 0) {
-               get_atts(atts, "file", &name, NULL);
-               parse_xml_file(name, start_set_element, end_set_element, ctx);
-       } else if (strcmp(element, "update") == 0) {
-               /* run update to create new set */
-       } else if (strcmp(element, "verify") == 0) {
-               verify_begin(ctx, atts);
+
+       if (strcmp(element, "tests") == 0) {
+               ;
+       } else if (strcmp(element, "test") == 0) {
+               start_test(ctx, atts);
+       } else if (strcmp(element, "set") == 0) {
+               start_set(ctx, atts);
+       } else if (strcmp(element, "transaction") == 0) {
+               start_transaction(ctx, atts);
+       } else if (strcmp(element, "install") == 0) {
+               start_install_or_update(ctx, atts);
+       } else if (strcmp(element, "install") == 0) {
+               start_install_or_update(ctx, atts);
+       } else if (strcmp(element, "remove") == 0) {
+               start_remove(ctx, atts);
+       } else if (strcmp(element, "result") == 0) {
+               start_result(ctx, atts);
+       } else if (strcmp(element, "unsatisfied") == 0) {
+               start_unsatisfied(ctx, atts);
        } else if (strcmp(element, "package") == 0) {
-               verify_package(ctx, atts);
+               start_package(ctx, atts);
        } else if (strcmp(element, "requires") == 0) {
-               verify_property(ctx, RAZOR_PROPERTY_REQUIRES, atts);
+               start_property(ctx, RAZOR_PROPERTY_REQUIRES, atts);
        } else if (strcmp(element, "provides") == 0) {
-               verify_property(ctx, RAZOR_PROPERTY_PROVIDES, atts);
+               start_property(ctx, RAZOR_PROPERTY_PROVIDES, atts);
        } else if (strcmp(element, "conflicts") == 0) {
-               verify_property(ctx, RAZOR_PROPERTY_CONFLICTS, atts);
+               start_property(ctx, RAZOR_PROPERTY_CONFLICTS, atts);
        } else if (strcmp(element, "obsoletes") == 0) {
-               verify_property(ctx, RAZOR_PROPERTY_OBSOLETES, atts);
+               start_property(ctx, RAZOR_PROPERTY_OBSOLETES, atts);
+       } else {
+               fprintf(stderr, "Unrecognized element '%s'\n", element);
+               exit(1);
        }
 }
 
@@ -318,8 +350,19 @@ end_test_element (void *data, const char *element)
 {
        struct test_context *ctx = data;
 
-       if (strcmp(element, "verify") == 0)
-               verify_end(ctx);
+       if (strcmp(element, "test") == 0) {
+               end_test(ctx);
+       } else if (strcmp(element, "set") == 0) {
+               end_set(ctx);
+       } else if (strcmp(element, "package") == 0) {
+               end_package(ctx);
+       } else if (strcmp(element, "transaction") == 0) {
+               end_transaction(ctx);
+       } else if (strcmp(element, "result") == 0) {
+               end_result(ctx);
+       } else if (strcmp(element, "unsatisfied") == 0) {
+               end_unsatisfied(ctx);
+       }
 }
 
 int main(int argc, char *argv[])
index ac61447..7068c9d 100644 (file)
--- a/test.xml
+++ b/test.xml
-<test title="gah">
+<tests>
 
-  <import file="sets.xml"/>
+    <test name="testEmpty">
+       <set name="system"/>
+       <set name="repo">
+           <package name="zsh" version="1-1" arch="i386"/>
+       </set>
+       <transaction>
+           <install name="zsh"/>
+           <remove name="zsh"/>
+       </transaction>
+       <result>
+           <set/>
+       </result>
+    </test>
 
-  <update name="c" from="a" to="b"/>
+    <test name="testInstallSinglePackageNoRequires">
+       <set name="system"/>
+       <set name="repo">
+           <package name="zsh" version="1-1" arch="i386"/>
+       </set>
+       <transaction>
+           <install name="zsh"/>
+       </transaction>
+       <result>
+           <set>
+               <package name="zsh" version="1-1" arch="i386"/>
+           </set>
+       </result>
+    </test>
 
-  <verify set="b" type="packages">
-    <package name="bash" version="3.2-18.fc8"/>
-  </verify>
+    <test name="testInstallSinglePackageRequireNotProvided">
+       <set name="system"/>
+       <set name="repo">
+           <package name="zsh" version="1-1" arch="i386">
+               <requires name="zip"/>
+           </package>
+       </set>
+       <transaction>
+           <install name="zsh"/>
+       </transaction>
+       <result>
+           <unsatisfiable>
+               <requires name="zip"/>
+           </unsatisfiable>
+       </result>
+    </test>
 
-  <verify set="c" type="properties">
-    <provides name="nss" eq="1.8-fc10"/>
-    <conflicts name="y" eq="1.1"/>
-  </verify>
+    <test name="testInstallSinglePackageRequireInstalled">
+       <set name="system">
+           <package name="zip" version="1-1" arch="i386"/>
+       </set>
+       <set name="repo">
+           <package name="zsh" version="1-1" arch="i386">
+               <requires name="zip"/>
+           </package>
+       </set>
+       <transaction>
+           <install name="zsh"/>
+       </transaction>
+       <result>
+           <set>
+               <package name="zip" version="1-1" arch="i386"/>
+               <package name="zsh" version="1-1" arch="i386"/>
+           </set>
+       </result>
+    </test>
 
-</test>
+    <test name="testInstallSinglePackageRequireInstalledRequireNotProvided">
+       <set name="system">
+           <package name="zip" version="1-2" arch="i386">
+               <requires name="zap"/>
+           </package>
+       </set>
+       <set name="repo">
+           <package name="zsh" version="1-1" arch="i386">
+               <requires name="zip"/>
+           </package>
+       </set>
+       <transaction>
+           <install name="zsh"/>
+       </transaction>
+       <result>
+           <unsatisfiable>
+               <requires name="zap"/>
+           </unsatisfiable>
+       </result>
+    </test>
+
+    <test name="testInstallSinglePackageRequireInstalledRequireInstall">
+       <set name="system">
+           <package name="zip" version="1-3" arch="i386">
+               <requires name="zap"/>
+           </package>
+       </set>
+       <set name="repo">
+           <package name="zsh" version="1-1" arch="i386">
+               <requires name="zip"/>
+           </package>
+           <package name="zap" version="1-2" arch="i386"/>
+       </set>
+       <transaction>
+           <install name="zsh"/>
+           <install name="zap"/>
+       </transaction>
+       <result>
+           <set>
+               <package name="zap" version="1-2" arch="i386"/>
+               <package name="zip" version="1-3" arch="i386"/>
+               <package name="zsh" version="1-1" arch="i386"/>
+           </set>
+       </result>
+    </test>
+
+    <test name="testInstallSinglePackageRequireVer1NotProvided">
+       <set name="system">
+           <package name="zip" version="1.0-2" arch="i386"/>
+       </set>
+       <set name="repo">
+           <package name="zsh" version="1-1" arch="i386">
+               <requires name="zip" relation="EQ" version="1.3-2"/>
+           </package>
+       </set>
+       <transaction>
+           <install name="zsh"/>
+       </transaction>
+       <result>
+           <unsatisfiable>
+               <requires name="zip" relation="EQ" version="1.3-2"/>
+           </unsatisfiable>
+       </result>
+    </test>
+
+    <test name="testInstallSinglePackageRequireVer1Installed">
+       <set name="system">
+           <package name="zip" version="1.3-2" arch="i386"/>
+       </set>
+       <set name="repo">
+           <package name="zsh" version="1-1" arch="i386">
+               <requires name="zip" relation="EQ" version="1.3-2"/>
+           </package>
+       </set>
+       <transaction>
+           <install name="zsh"/>
+       </transaction>
+       <result>
+           <set>
+               <package name="zip" version="1.3-2" arch="i386"/>
+               <package name="zsh" version="1-1" arch="i386"/>
+           </set>
+       </result>
+    </test>
+
+    <test name="testInstallSinglePackageRequireVer2NotProvided">
+       <set name="system">
+           <package name="zip" version="1.3-2" arch="i386"/>
+       </set>
+       <set name="repo">
+           <package name="zsh" version="1-1" arch="i386">
+               <requires name="zip" relation="EQ" version="1.3-4"/>
+           </package>
+       </set>
+       <transaction>
+           <install name="zsh"/>
+       </transaction>
+       <result>
+           <unsatisfiable>
+               <requires name="zip" relation="EQ" version="1.3-4"/>
+           </unsatisfiable>
+       </result>
+    </test>
+
+    <test name="testInstallSinglePackageRequireVer2Installed">
+       <set name="system">
+           <package name="zip" version="1.3-4" arch="i386"/>
+       </set>
+       <set name="repo">
+           <package name="zsh" version="1-1" arch="i386">
+               <requires name="zip" relation="EQ" version="1.3-4"/>
+           </package>
+       </set>
+       <transaction>
+           <install name="zsh"/>
+       </transaction>
+       <result>
+           <set>
+               <package name="zip" version="1.3-4" arch="i386"/>
+               <package name="zsh" version="1-1" arch="i386"/>
+           </set>
+       </result>
+    </test>
+
+    <test name="testInstallSinglePackageRequireVer3NotProvided">
+       <set name="system">
+           <package name="zip" version="0:1.3-4" arch="i386"/>
+       </set>
+       <set name="repo">
+           <package name="zsh" version="1-1" arch="i386">
+               <requires name="zip" relation="GE" version="1:1.3-4"/>
+           </package>
+       </set>
+       <transaction>
+           <install name="zsh"/>
+       </transaction>
+       <result>
+           <unsatisfiable>
+               <requires name="zip" relation="GE" version="1:1.3-4"/>
+           </unsatisfiable>
+       </result>
+    </test>
+
+    <test name="testInstallSinglePackageRequireVer3Installed">
+       <set name="system">
+           <package name="zip" version="2:1.3-4" arch="i386"/>
+       </set>
+       <set name="repo">
+           <package name="zsh" version="1-1" arch="i386">
+               <requires name="zip" relation="GE" version="2:1.3-4"/>
+           </package>
+       </set>
+       <transaction>
+           <install name="zsh"/>
+       </transaction>
+       <result>
+           <set>
+               <package name="zip" version="2:1.3-4" arch="i386"/>
+               <package name="zsh" version="1-1" arch="i386"/>
+           </set>
+       </result>
+    </test>
+
+    <test name="testInstallSinglePackageRequireVer4NotProvided">
+       <set name="system">
+           <package name="zip" version="2:1.3-4" arch="i386"/>
+       </set>
+       <set name="repo">
+           <package name="zsh" version="1-1" arch="i386">
+               <requires name="zip" relation="LT" version="2:1.3-4"/>
+           </package>
+       </set>
+       <transaction>
+           <install name="zsh"/>
+       </transaction>
+       <result>
+           <unsatisfiable>
+               <requires name="zip" relation="LT" version="2:1.3-4"/>
+           </unsatisfiable>
+       </result>
+    </test>
+
+    <test name="testInstallSinglePackageRequireVer4_1Installed">
+       <set name="system">
+           <package name="zip" version="2:1.0-4" arch="i386"/>
+       </set>
+       <set name="repo">
+           <package name="zsh" version="1-1" arch="i386">
+               <requires name="zip" relation="LT" version="2:1.3-4"/>
+           </package>
+       </set>
+       <transaction>
+           <install name="zsh"/>
+       </transaction>
+       <result>
+           <set>
+               <package name="zip" version="2:1.0-4" arch="i386"/>
+               <package name="zsh" version="1-1" arch="i386"/>
+           </set>
+       </result>
+    </test>
+
+    <test name="testInstallSinglePackageRequireVer4_2Installed">
+       <set name="system">
+           <package name="zip" version="2:1.3-3" arch="i386"/>
+       </set>
+       <set name="repo">
+           <package name="zsh" version="1-1" arch="i386">
+               <requires name="zip" relation="LT" version="2:1.3-4"/>
+           </package>
+       </set>
+       <transaction>
+           <install name="zsh"/>
+       </transaction>
+       <result>
+           <set>
+               <package name="zip" version="2:1.3-3" arch="i386"/>
+               <package name="zsh" version="1-1" arch="i386"/>
+           </set>
+       </result>
+    </test>
+
+    <test name="testInstallSinglePackageRequireVer4_3Installed">
+       <set name="system">
+           <package name="zip" version="1.3-4" arch="i386"/>
+       </set>
+       <set name="repo">
+           <package name="zsh" version="1-1" arch="i386">
+               <requires name="zip" relation="LT" version="2:1.3-4"/>
+           </package>
+       </set>
+       <transaction>
+           <install name="zsh"/>
+       </transaction>
+       <result>
+           <set>
+               <package name="zip" version="1.3-4" arch="i386"/>
+               <package name="zsh" version="1-1" arch="i386"/>
+           </set>
+       </result>
+    </test>
+
+    <test name="testInstallSinglePackageRequireVer4_4Installed">
+       <set name="system">
+           <package name="zip" version="1:1.3-4" arch="i386"/>
+       </set>
+       <set name="repo">
+           <package name="zsh" version="1-1" arch="i386">
+               <requires name="zip" relation="LT" version="2:1.3-4"/>
+           </package>
+       </set>
+       <transaction>
+           <install name="zsh"/>
+       </transaction>
+       <result>
+           <set>
+               <package name="zip" version="1:1.3-4" arch="i386"/>
+               <package name="zsh" version="1-1" arch="i386"/>
+           </set>
+       </result>
+    </test>
+
+    <test name="testInstallSinglePackageRequireVer4_5Installed">
+       <set name="system">
+           <package name="zip" version="2:0.3-4" arch="i386"/>
+       </set>
+       <set name="repo">
+           <package name="zsh" version="1-1" arch="i386">
+               <requires name="zip" relation="LT" version="2:1.3-4"/>
+           </package>
+       </set>
+       <transaction>
+           <install name="zsh"/>
+       </transaction>
+       <result>
+           <set>
+               <package name="zip" version="2:0.3-4" arch="i386"/>
+               <package name="zsh" version="1-1" arch="i386"/>
+           </set>
+       </result>
+    </test>
+
+    <test name="testInstallSinglePackageRequireXtraBadVer">
+       <set name="system">
+           <package name="zip" version="2:1.3-4" arch="i386"/>
+       </set>
+       <set name="repo">
+           <package name="zsh" version="1-1" arch="i386">
+               <requires name="zip" relation="EQ" version="2:1.3-4"/>
+               <requires name="zap" relation="EQ" version="2:1.3-4"/>
+           </package>
+           <package name="zap" version="0:1.3-4" arch="i386"/>
+       </set>
+       <transaction>
+           <install name="zsh"/>
+       </transaction>
+       <result>
+           <unsatisfiable>
+               <requires name="zap" relation="EQ" version="2:1.3-4"/>
+           </unsatisfiable>
+       </result>
+    </test>
+
+    <test name="testInstallSinglePackageRequireXtra">
+       <set name="system">
+           <package name="zip" version="2:1.3-4" arch="i386"/>
+       </set>
+       <set name="repo">
+           <package name="zsh" version="1-1" arch="i386">
+               <requires name="zip" relation="EQ" version="2:1.3-4"/>
+               <requires name="zap" relation="EQ" version="4:2.6-8"/>
+           </package>
+           <package name="zap" version="4:2.6-8" arch="i386"/>
+       </set>
+       <transaction>
+           <install name="zsh"/>
+       </transaction>
+       <result>
+           <set>
+               <package name="zap" version="4:2.6-8" arch="i386"/>
+               <package name="zip" version="2:1.3-4" arch="i386"/>
+               <package name="zsh" version="1-1" arch="i386"/>
+           </set>
+       </result>
+    </test>
+
+    <test name="testInstallSinglePackageRequireInstalledRequireXtra">
+       <set name="system">
+           <package name="zip" version="2:1.3-4" arch="i386">
+               <requires name="zap" relation="EQ" version="4:2.6-8"/>
+           </package>
+       </set>
+       <set name="repo">
+           <package name="zsh" version="1-1" arch="i386">
+               <requires name="zip" relation="EQ" version="2:1.3-4"/>
+           </package>
+           <package name="zap" version="4:2.6-8" arch="i386"/>
+       </set>
+       <transaction>
+           <install name="zsh"/>
+       </transaction>
+       <result>
+           <set>
+               <package name="zip" version="2:1.3-4" arch="i386"/>
+               <package name="zsh" version="1-1" arch="i386"/>
+           </set>
+       </result>
+    </test>
+
+    <test name="testInstallSinglePackageRequireUpgradeRequireXtraErr">
+       <set name="system">
+           <package name="zip" version="2:1.3-4" arch="i386">
+               <requires name="zap" relation="EQ" version="2:1.3-3"/>
+           </package>
+       </set>
+       <set name="repo">
+           <package name="zsh" version="1-1" arch="i386">
+               <requires name="zip" relation="EQ" version="4:2.6-8"/>
+           </package>
+           <package name="zip" version="4:2.6-8" arch="i386">
+               <requires name="zap" relation="EQ" version="2:1.3-4"/>
+           </package>
+           <package name="zap" version="2:1.3-4" arch="i386">
+               <requires name="zsh" relation="EQ" version="2:4-8"/>
+           </package>
+       </set>
+       <transaction>
+           <install name="zsh"/>
+       </transaction>
+       <result>
+           <unsatisfiable>
+               <requires name="zsh" relation="EQ" version="2:4-8"/>
+           </unsatisfiable>
+       </result>
+    </test>
+
+    <test name="testInstallSinglePackageRequireUpgradeRequireXtraOk">
+       <set name="system">
+           <package name="zip" version="2:1.3-4" arch="i386">
+               <requires name="zap" relation="EQ" version="2:1.3-3"/>
+           </package>
+       </set>
+       <set name="repo">
+           <package name="zsh" version="1-1" arch="i386">
+               <requires name="zip" relation="EQ" version="4:2.6-8"/>
+           </package>
+           <package name="zip" version="4:2.6-8" arch="i386">
+               <requires name="zap" relation="EQ" version="2:1.3-4"/>
+           </package>
+           <package name="zap" version="2:1.3-4" arch="i386"/>
+       </set>
+       <transaction>
+           <install name="zsh"/>
+       </transaction>
+       <result>
+           <set>
+               <package name="zap" version="2:1.3-4" arch="i386"/>
+               <package name="zip" version="4:2.6-8" arch="i386"/>
+               <package name="zsh" version="1-1" arch="i386"/>
+           </set>
+       </result>
+    </test>
+
+    <test name="testInstallSinglePackageRequireMultiXtra">
+       <set name="system"/>
+       <set name="repo">
+           <package name="zsh" version="1-1" arch="i386">
+               <requires name="zip" relation="EQ" version="4:2.6-8"/>
+           </package>
+           <package name="zip" version="4:2.6-8" arch="i386">
+               <requires name="zap" relation="EQ" version="2:1.3-4"/>
+           </package>
+           <package name="zap" version="2:1.3-4" arch="i386"/>
+       </set>
+       <transaction>
+           <install name="zsh"/>
+       </transaction>
+       <result>
+           <set>
+               <package name="zap" version="2:1.3-4" arch="i386"/>
+               <package name="zip" version="4:2.6-8" arch="i386"/>
+               <package name="zsh" version="1-1" arch="i386"/>
+           </set>
+       </result>
+    </test>
+
+    <test name="testInstallSinglePackageRequireInstalledMultiLib">
+       <set name="system">
+           <package name="zip" version="1-3" arch="i386"/>
+       </set>
+       <set name="repo">
+           <package name="zsh" version="1-1" arch="x86_64">
+               <requires name="zip"/>
+           </package>
+           <package name="zip" version="1-3" arch="x86_64"/>
+       </set>
+       <transaction>
+           <install name="zsh"/>
+       </transaction>
+       <result>
+           <set>
+               <package name="zip" version="1-3" arch="i386"/>
+               <package name="zsh" version="1-1" arch="x86_64"/>
+           </set>
+       </result>
+    </test>
+
+    <test name="testInstallSinglePackageRequireXtra1MultiLib">
+       <set name="system"/>
+       <set name="repo">
+           <package name="zsh" version="1-1" arch="x86_64">
+               <requires name="zip"/>
+           </package>
+           <package name="zip" version="1-3" arch="i386"/>
+       </set>
+       <transaction>
+           <install name="zsh"/>
+       </transaction>
+       <result>
+           <set>
+               <package name="zip" version="1-3" arch="i386"/>
+               <package name="zsh" version="1-1" arch="x86_64"/>
+           </set>
+       </result>
+    </test>
+
+    <test name="testInstallSinglePackageRequireXtra2_64MultiLib">
+       <set name="system"/>
+       <set name="repo">
+           <package name="zsh" version="1-1" arch="x86_64">
+               <requires name="zip"/>
+           </package>
+           <package name="zip" version="1-3" arch="i386"/>
+           <package name="zip" version="1-3" arch="x86_64"/>
+       </set>
+       <transaction>
+           <install name="zsh"/>
+       </transaction>
+       <result>
+           <set>
+               <package name="zsh" version="1-1" arch="x86_64"/>
+               <package name="zip" version="1-3" arch="x86_64"/>
+           </set>
+       </result>
+    </test>
+
+    <test name="testInstallSinglePackageRequireXtra2_32MultiLib">
+       <set name="system"/>
+       <set name="repo">
+           <package name="zsh" version="1-1" arch="i386">
+               <requires name="zip"/>
+           </package>
+           <package name="zip" version="1-3" arch="i386"/>
+           <package name="zip" version="1-3" arch="x86_64"/>
+       </set>
+       <transaction>
+           <install name="zsh"/>
+       </transaction>
+       <result>
+           <set>
+               <package name="zip" version="1-3" arch="i386"/>
+               <package name="zsh" version="1-1" arch="i386"/>
+           </set>
+       </result>
+    </test>
+
+    <test name="testUpdateSinglePackage">
+       <set name="system">
+           <package name="zsh" version="1-1" arch="i386"/>
+       </set>
+       <set name="repo">
+           <package name="zsh" version="1-3" arch="i386"/>
+       </set>
+       <transaction>
+           <update name="zsh"/>
+       </transaction>
+       <result>
+           <set>
+               <package name="zsh" version="1-3" arch="i386"/>
+           </set>
+       </result>
+    </test>
+
+    <test name="testUpdateForDependency">
+       <set name="system">
+           <package name="zip" version="0:1-1" arch="i386"/>
+       </set>
+       <set name="repo">
+           <package name="zsh" version="0:1-1" arch="i386">
+               <requires name="zip" relation="EQ" version="0:2-1"/>
+           </package>
+           <package name="zip" version="0:2-1" arch="i386"/>
+       </set>
+       <transaction>
+           <install name="zsh"/>
+       </transaction>
+       <result>
+           <set>
+               <package name="zip" version="0:2-1" arch="i386"/>
+               <package name="zsh" version="0:1-1" arch="i386"/>
+           </set>
+       </result>
+    </test>
+
+    <test name="testUpdateSplitPackage">
+       <set name="system">
+           <package name="zip" version="0:1-1" arch="i386">
+               <provides name="libzip" relation="EQ" version="0:1-1"/>
+           </package>
+       </set>
+       <set name="repo">
+           <package name="zsh" version="0:1-1" arch="i386">
+               <requires name="libzip" relation="EQ" version="0:2-1"/>
+           </package>
+           <package name="zip" version="0:2-1" arch="i386">
+               <requires name="zip-libs" relation="EQ" version="0:2-1"/>
+           </package>
+           <package name="zip-libs" version="0:2-1" arch="i386">
+               <provides name="libzip" relation="EQ" version="0:2-1"/>
+           </package>
+       </set>
+       <transaction>
+           <install name="zsh"/>
+       </transaction>
+       <result>
+           <set>
+               <package name="zip" version="0:1-1" arch="i386"/>
+               <package name="zip-libs" version="0:2-1" arch="i386"/>
+               <package name="zsh" version="0:1-1" arch="i386"/>
+           </set>
+       </result>
+    </test>
+
+    <test name="testUpdateSinglePackageNewRequires">
+       <set name="system">
+           <package name="zsh" version="1-1" arch="i386"/>
+       </set>
+       <set name="repo">
+           <package name="zsh" version="1-3" arch="i386">
+               <requires name="zip"/>
+           </package>
+           <package name="zip" version="1-3" arch="x86_64"/>
+       </set>
+       <transaction>
+           <update name="zsh"/>
+       </transaction>
+       <result>
+           <set>
+               <package name="zsh" version="1-3" arch="i386"/>
+               <package name="zip" version="1-3" arch="x86_64"/>
+           </set>
+       </result>
+    </test>
+
+    <test name="testUpdateSinglePackageOldRequires">
+       <set name="system">
+           <package name="zsh" version="1-1" arch="i386">
+               <requires name="zip"/>
+           </package>
+           <package name="zip" version="1-3" arch="x86_64"/>
+       </set>
+       <set name="repo">
+           <package name="zsh" version="1-3" arch="i386">
+               <requires name="zip"/>
+           </package>
+       </set>
+       <transaction>
+           <update name="zsh"/>
+       </transaction>
+       <result>
+           <set>
+               <package name="zip" version="1-3" arch="x86_64"/>
+               <package name="zsh" version="1-3" arch="i386"/>
+           </set>
+       </result>
+    </test>
+
+    <test name="testUpdateSinglePackageOldRequiresGone">
+       <set name="system">
+           <package name="zsh" version="1-1" arch="i386">
+               <requires name="zip"/>
+           </package>
+           <package name="zip" version="1-3" arch="x86_64"/>
+       </set>
+       <set name="repo">
+           <package name="zsh" version="1-3" arch="i386"/>
+       </set>
+       <transaction>
+           <update name="zsh"/>
+       </transaction>
+       <result>
+           <set>
+               <package name="zip" version="1-3" arch="x86_64"/>
+               <package name="zsh" version="1-3" arch="i386"/>
+           </set>
+       </result>
+    </test>
+
+    <test name="testUpdateSinglePackageObsoletesOldRequirement">
+       <set name="system">
+           <package name="zsh" version="1-1" arch="i386">
+               <requires name="zip"/>
+           </package>
+           <package name="zip" version="1-1" arch="i386"/>
+       </set>
+       <set name="repo">
+           <package name="zsh" version="1-3" arch="i386">
+               <!-- depsolvetests.py actually adds the obsoletes
+                    to the installed zsh rather than the new zsh,
+                    but I'm assuming that's a bug -->
+               <obsoletes name="zip"/>
+           </package>
+       </set>
+       <transaction>
+           <update name="zsh"/>
+       </transaction>
+       <result>
+           <set>
+               <package name="zsh" version="1-3" arch="i386"/>
+           </set>
+       </result>
+    </test>
+
+    <test name="testUpdateForConflict">
+       <set name="system">
+           <package name="zip" version="0:1-1" arch="i386"/>
+       </set>
+       <set name="repo">
+           <package name="zsh" version="0:1-1" arch="i386">
+               <conflicts name="zip" relation="LE" version="0:1-1"/>
+           </package>
+           <package name="zip" version="0:2-1" arch="i386"/>
+       </set>
+       <transaction>
+           <install name="zsh"/>
+       </transaction>
+       <result>
+           <set>
+               <package name="zip" version="0:2-1" arch="i386"/>
+               <package name="zsh" version="0:1-1" arch="i386"/>
+           </set>
+       </result>
+    </test>
+
+    <test name="testUpdateForConflict2">
+       <set name="system">
+           <package name="zip" version="0:1-1" arch="i386">
+               <conflicts name="zsh" relation="LE" version="0:1-1"/>
+           </package>
+       </set>
+       <set name="repo">
+           <package name="zsh" version="0:1-1" arch="i386"/>
+           <package name="zip" version="0:2-1" arch="i386"/>
+       </set>
+       <transaction>
+           <install name="zsh"/>
+       </transaction>
+       <result>
+           <set>
+               <package name="zsh" version="0:1-1" arch="i386"/>
+               <package name="zip" version="0:2-1" arch="i386"/>
+           </set>
+       </result>
+    </test>
+
+    <test name="testUpdateForConflictProvide">
+       <set name="system">
+           <package name="zip" version="0:1-1" arch="i386">
+               <provides name="zippy" relation="EQ" version="0:1-1"/>
+           </package>
+       </set>
+       <set name="repo">
+           <package name="zsh" version="0:1-1" arch="i386">
+               <conflicts name="zippy" relation="LE" version="0:1-1"/>
+           </package>
+           <package name="zip" version="0:2-1" arch="i386"/>
+       </set>
+       <transaction>
+           <install name="zsh"/>
+       </transaction>
+       <result>
+           <set>
+               <package name="zip" version="0:2-1" arch="i386"/>
+               <package name="zsh" version="0:1-1" arch="i386"/>
+           </set>
+       </result>
+    </test>
+
+    <test name="testUpdateForConflictProvide2">
+       <set name="system">
+           <package name="zip" version="0:1-1" arch="i386">
+               <conflicts name="zippy" relation="GT" version="0:1-1"/>
+               <conflicts name="zippy" relation="LT" version="0:1-1"/>
+           </package>
+       </set>
+       <set name="repo">
+           <package name="zsh" version="0:1-1" arch="i386">
+               <provides name="zippy" relation="EQ" version="0:2-1"/>
+           </package>
+           <package name="zip" version="0:2-1" arch="i386">
+               <conflicts name="zippy" relation="GT" version="0:2-1"/>
+               <conflicts name="zippy" relation="LT" version="0:2-1"/>
+           </package>
+       </set>
+       <transaction>
+           <install name="zsh"/>
+       </transaction>
+       <result>
+           <set>
+               <package name="zip" version="0:2-1" arch="i386"/>
+               <package name="zsh" version="0:1-1" arch="i386"/>
+           </set>
+       </result>
+    </test>
+
+    <test name="testEraseSinglePackage">
+       <set name="system">
+           <package name="zsh" version="0:1-1" arch="i386"/>
+       </set>
+       <set name="repo"/>
+       <transaction>
+           <remove name="zsh"/>
+       </transaction>
+       <result>
+           <set/>
+       </result>
+    </test>
+
+    <test name="testEraseSinglePackageRequiredByOneInstalled">
+       <set name="system">
+           <package name="zippy" version="0:1-1" arch="i386">
+               <requires name="zsh"/>
+           </package>
+           <package name="zsh" version="0:1-1" arch="i386"/>
+       </set>
+       <set name="repo"/>
+       <transaction>
+           <remove name="zsh"/>
+       </transaction>
+       <result>
+           <set/>
+       </result>
+    </test>
+</tests>