ali@38: /* ali@38: * Copyright (C) 2016 J. Ali Harlow ali@38: * ali@38: * This program is free software; you can redistribute it and/or modify ali@38: * it under the terms of the GNU General Public License as published by ali@38: * the Free Software Foundation; either version 2 of the License, or ali@38: * (at your option) any later version. ali@38: * ali@38: * This program is distributed in the hope that it will be useful, ali@38: * but WITHOUT ANY WARRANTY; without even the implied warranty of ali@38: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ali@38: * GNU General Public License for more details. ali@38: * ali@38: * You should have received a copy of the GNU General Public License along ali@38: * with this program; if not, write to the Free Software Foundation, Inc., ali@38: * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. ali@38: */ ali@38: ali@38: #include ali@38: #include ali@38: #include ali@38: #include ali@38: ali@38: struct razor_set *test_set=NULL; ali@38: struct razor_package *test_pkg=NULL; ali@38: ali@38: static void finalize(void) ali@38: { ali@38: if (test_set) ali@38: razor_set_unref(test_set); ali@38: } ali@38: ali@38: void import_properties(struct razor_importer *importer, ali@38: struct razor_set *set,struct razor_package *pkg) ali@38: { ali@38: struct razor_property_iterator *iter; ali@38: struct razor_property *prop; ali@38: uint32_t flags; ali@38: const char *name,*version; ali@38: iter=razor_property_iterator_create(set,pkg); ali@38: while(razor_property_iterator_next(iter,&prop,&name,&flags,&version)) ali@38: razor_importer_add_property(importer,name,flags,version); ali@38: razor_property_iterator_destroy(iter); ali@38: } ali@38: ali@38: void import_files(struct razor_importer *importer, ali@38: struct razor_set *set,struct razor_package *pkg) ali@38: { ali@38: struct razor_file_iterator *iter; ali@38: const char *name; ali@38: iter=razor_file_iterator_create(set,pkg,FALSE); ali@38: while(razor_file_iterator_next(iter,&name)) ali@38: razor_importer_add_file(importer,name); ali@38: razor_file_iterator_destroy(iter); ali@38: } ali@38: ali@38: gboolean import_rpm(struct razor_rpm *rpm) ali@38: { ali@38: int i; ali@38: struct razor_importer *importer; ali@38: struct razor_package_iterator *iter; ali@38: struct razor_set *set; ali@38: struct razor_package *pkg=NULL; ali@38: const char *name,*version,*arch,*summary,*description,*url,*license; ali@38: const char *s,*pkg_name; ali@38: const char *const *prefixes; ali@38: /* ali@38: * First pass: get a razor_set and razor_package with everything ali@38: * except the prefixes. ali@38: */ ali@38: importer=razor_importer_create(); ali@38: if (razor_importer_add_rpm(importer,rpm)) ali@38: g_error("../yum-repo-test-dir: Failed to add rpm"); ali@38: set=razor_importer_finish(importer); ali@38: if (!set) ali@38: g_error("../yum-repo-test-dir: Failed to import"); ali@38: iter=razor_package_iterator_create(set); ali@38: pkg=NULL; ali@38: razor_rpm_get_details(rpm,RAZOR_DETAIL_NAME,&pkg_name,RAZOR_DETAIL_LAST); ali@38: while(razor_package_iterator_next(iter,&pkg,RAZOR_DETAIL_NAME,&s, ali@38: RAZOR_DETAIL_LAST)) ali@38: if (!strcmp(s,pkg_name)) ali@38: break; ali@38: razor_package_iterator_destroy(iter); ali@38: if (!pkg) ali@38: { ali@38: razor_set_unref(set); ali@38: return FALSE; ali@38: } ali@38: /* ali@38: * Second pass: use the information from the first pass plus the ali@38: * prefixes to create a final razor_set and razor_package. ali@38: */ ali@38: importer=razor_importer_create(); ali@38: razor_package_get_details(set,pkg,RAZOR_DETAIL_NAME,&name, ali@38: RAZOR_DETAIL_VERSION,&version,RAZOR_DETAIL_ARCH,&arch, ali@38: RAZOR_DETAIL_SUMMARY,&summary,RAZOR_DETAIL_DESCRIPTION,&description, ali@38: RAZOR_DETAIL_URL,&url,RAZOR_DETAIL_LICENSE,&license,RAZOR_DETAIL_LAST); ali@38: razor_importer_begin_package(importer,name,version,arch); ali@38: razor_importer_add_details(importer,summary,description,url,license); ali@38: import_properties(importer,set,pkg); ali@38: import_files(importer,set,pkg); ali@38: razor_rpm_get_details(rpm,RAZOR_DETAIL_PREFIXES,&prefixes, ali@38: RAZOR_DETAIL_LAST); ali@38: for(i=0;prefixes && prefixes[i];i++) ali@38: razor_importer_add_install_prefix(importer,prefixes[i]); ali@38: razor_importer_finish_package(importer); ali@38: razor_set_unref(set); ali@38: test_set=razor_importer_finish(importer); ali@38: g_assert(test_set != NULL); ali@38: iter=razor_package_iterator_create(test_set); ali@38: test_pkg=NULL; ali@38: while(razor_package_iterator_next(iter,&test_pkg,RAZOR_DETAIL_NAME,&s, ali@38: RAZOR_DETAIL_LAST)) ali@38: if (!strcmp(s,pkg_name)) ali@38: break; ali@38: razor_package_iterator_destroy(iter); ali@38: return !!test_pkg; ali@38: } ali@38: ali@38: static PloverPackage *package_getref(const char *name,const char *version) ali@38: { ali@38: struct razor_rpm *rpm; ali@38: PloverPackage *package=NULL; ali@38: struct razor_error *err=NULL; ali@44: gchar *uri; ali@38: if (test_set) ali@38: { ali@38: razor_set_unref(test_set); ali@38: test_set=NULL; ali@38: } ali@38: /* ali@38: * yum metadata doesn't include all the information included in ali@38: * a rpm file, so do this the hard way. Unfortunately, ali@38: * razor_importer_add_rpm() doesn't support prefixes so we have ali@38: * to do it the really hard way. ali@38: */ ali@55: uri=g_strconcat("file:../yum-repo-test-dir/Packages/",name,"-",version, ali@38: ".noarch.rpm",NULL); ali@44: rpm=razor_rpm_open(uri,&err); ali@38: if (!rpm) ali@44: g_error("%s: %s",uri,razor_error_get_msg(err)); ali@44: g_free(uri); ali@38: if (import_rpm(rpm)) ali@38: package=plover_package_new(test_set,test_pkg); ali@38: else ali@38: package=NULL; ali@38: razor_rpm_close(rpm); ali@38: return package; ali@38: } ali@38: ali@38: static void test_basic_properties(void) ali@38: { ali@38: PloverPackage *package; ali@38: package=package_getref("zsh","1-1"); ali@38: g_assert(package != NULL); ali@38: g_assert(plover_package_get_razor_set(package) == test_set); ali@38: g_assert(plover_package_get_razor_package(package) == test_pkg); ali@38: g_assert_cmpstr(plover_package_get_name(package),==,"zsh"); ali@38: g_assert_cmpstr(plover_package_get_summary(package),==,"Test package"); ali@38: g_assert_cmpstr(plover_package_get_version(package),==,"1-1"); ali@38: g_assert_cmpstr(plover_package_get_license(package),==,"GPL"); ali@38: g_assert_cmpstr(plover_package_get_arch(package),==,"noarch"); ali@38: g_assert_cmpstr(plover_package_get_description(package),==,"Test package"); ali@38: g_assert_cmpstr(plover_package_get_URL(package),==, ali@38: "http://www.juiblex.co.uk/beach"); ali@38: g_object_unref(package); ali@38: } ali@38: ali@38: static void test_package_properties(void) ali@38: { ali@38: PloverPackage *package; ali@38: struct razor_property_iterator *iter; ali@38: struct razor_property *prop; ali@38: uint32_t flags; ali@38: const char *s,*name,*version; ali@38: GString *str; ali@38: GList *expected,*lnk; ali@38: package=package_getref("zsh","1-1"); ali@38: g_assert(package != NULL); ali@38: expected=g_list_prepend(NULL, ali@38: (gpointer)g_intern_string("requires(pre,postun): zip")); ali@38: expected=g_list_prepend(expected, ali@38: (gpointer)g_intern_string("requires: zip")); ali@38: expected=g_list_prepend(expected, ali@38: (gpointer)g_intern_string("provides: zsh = 1-1")); ali@38: iter=plover_package_property_iterator_create(package); ali@38: g_assert(iter != NULL); ali@38: while(razor_property_iterator_next(iter,&prop,&name,&flags,&version)) ali@38: { ali@38: if (g_str_has_prefix(name,"rpmlib(")) ali@38: continue; ali@38: s=razor_property_type_to_string(prop); ali@38: g_assert(s != NULL); ali@38: str=g_string_new(s); ali@38: if (flags&RAZOR_PROPERTY_SCRIPT_MASK) ali@38: { ali@38: g_string_append_c(str,'('); ali@38: if (flags&RAZOR_PROPERTY_PRE) ali@38: g_string_append(str,"pre"); ali@38: if (flags&RAZOR_PROPERTY_POST) ali@38: { ali@38: if (str->str[str->len-1]!='(' && str->str[str->len-1]!=',') ali@38: g_string_append_c(str,','); ali@38: g_string_append(str,"post"); ali@38: } ali@38: if (flags&RAZOR_PROPERTY_PREUN) ali@38: { ali@38: if (str->str[str->len-1]!='(' && str->str[str->len-1]!=',') ali@38: g_string_append_c(str,','); ali@38: g_string_append(str,"preun"); ali@38: } ali@38: if (flags&RAZOR_PROPERTY_POSTUN) ali@38: { ali@38: if (str->str[str->len-1]!='(' && str->str[str->len-1]!=',') ali@38: g_string_append_c(str,','); ali@38: g_string_append(str,"postun"); ali@38: } ali@38: g_string_append_c(str,')'); ali@38: } ali@38: g_string_append(str,": "); ali@38: g_string_append(str,name); ali@38: if (*version) ali@38: { ali@38: g_string_append_c(str,' '); ali@38: g_string_append(str,razor_property_relation_to_string(prop)); ali@38: g_string_append_c(str,' '); ali@38: g_string_append(str,version); ali@38: } ali@38: lnk=g_list_find(expected,g_intern_string(str->str)); ali@38: if (!lnk) ali@38: g_warning("Unexpected property in zsh package: %s",str->str); ali@38: else ali@38: expected=g_list_delete_link(expected,lnk); ali@38: g_string_free(str,TRUE); ali@38: } ali@38: razor_property_iterator_destroy(iter); ali@38: if (expected) ali@38: g_warning("%d missing propert%s in set, including %s", ali@38: g_list_length(expected),g_list_length(expected)==1?"y":"ies", ali@38: expected->data); ali@38: g_object_unref(package); ali@38: } ali@38: ali@38: static void test_package_files(void) ali@38: { ali@38: PloverPackage *package; ali@38: struct razor_file_iterator *iter; ali@38: const char *name; ali@38: GList *expected,*lnk; ali@38: package=package_getref("zsh","1-1"); ali@38: g_assert(package != NULL); ali@38: expected=g_list_prepend(NULL,(gpointer)g_intern_string("/etc/zsh.conf")); ali@38: expected=g_list_prepend(expected,(gpointer)g_intern_string("/usr/bin/zsh")); ali@38: iter=plover_package_file_iterator_create(package,FALSE); ali@38: g_assert(iter != NULL); ali@38: while(razor_file_iterator_next(iter,&name)) ali@38: { ali@38: lnk=g_list_find(expected,g_intern_string(name)); ali@38: if (!lnk) ali@38: g_warning("Unexpected file in zsh package: %s",name); ali@38: else ali@38: expected=g_list_delete_link(expected,lnk); ali@38: } ali@38: razor_file_iterator_destroy(iter); ali@38: if (expected) ali@38: g_warning("%d missing file%s in set, including %s", ali@38: g_list_length(expected),g_list_length(expected)==1?"":"s", ali@38: expected->data); ali@38: g_object_unref(package); ali@38: } ali@38: ali@38: static void test_package_icon(void) ali@38: { ali@38: /* ali@38: * icons aren't supported yet. ali@38: */ ali@38: PloverPackage *package; ali@38: GInputStream *stream; ali@38: GError *err=NULL; ali@38: package=package_getref("zsh","1-1"); ali@38: g_assert(package != NULL); ali@38: stream=plover_package_read_icon(package,&err); ali@38: if (stream) ali@38: { ali@38: /* Unexpected, but hardly an error */ ali@38: g_object_unref(stream); ali@38: } ali@38: else ali@38: { ali@38: g_assert(err != NULL); ali@38: g_assert(err->message != NULL); ali@38: g_error_free(err); ali@38: } ali@38: g_object_unref(package); ali@38: } ali@38: ali@38: static void test_package_prefixes(void) ali@38: { ali@38: PloverPackage *package; ali@38: const char *const *prefixes; ali@38: package=package_getref("zsh","1-1"); ali@38: g_assert(package != NULL); ali@38: prefixes=plover_package_get_prefixes(package); ali@38: g_assert_cmpstr(prefixes[0], ==, "/usr"); ali@38: g_assert(prefixes[1] == NULL); ali@38: g_object_unref(package); ali@38: } ali@38: ali@38: int main(int argc,char **argv) ali@38: { ali@38: int retval; ali@38: g_test_init(&argc,&argv,NULL); ali@38: g_test_bug_base("mailto:ali@juiblex.co.uk"); ali@38: g_test_add_func("/package/basic",test_basic_properties); ali@38: g_test_add_func("/package/icons",test_package_icon); ali@38: g_test_add_func("/package/properties",test_package_properties); ali@38: g_test_add_func("/package/files",test_package_files); ali@38: g_test_add_func("/package/prefixes",test_package_prefixes); ali@38: g_test_message("PloverPackage::changed signal unused and thus untestable"); ali@38: retval=g_test_run(); ali@38: finalize(); ali@38: return retval; ali@38: }