tests/plover/test-package.c
author J. Ali Harlow <ali@juiblex.co.uk>
Mon Jun 13 12:18:42 2016 +0100 (2016-06-13)
changeset 38 a29623b68ca2
child 44 43ffed8669ce
permissions -rw-r--r--
Add a testsuite and fix bugs found with it
     1 /*
     2  * Copyright (C) 2016  J. Ali Harlow <ali@juiblex.co.uk>
     3  *
     4  * This program is free software; you can redistribute it and/or modify
     5  * it under the terms of the GNU General Public License as published by
     6  * the Free Software Foundation; either version 2 of the License, or
     7  * (at your option) any later version.
     8  *
     9  * This program is distributed in the hope that it will be useful,
    10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
    11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    12  * GNU General Public License for more details.
    13  *
    14  * You should have received a copy of the GNU General Public License along
    15  * with this program; if not, write to the Free Software Foundation, Inc.,
    16  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
    17  */
    18 
    19 #include <stdlib.h>
    20 #include <razor.h>
    21 #include <plover/plover.h>
    22 #include <plover/package.h>
    23 
    24 struct razor_set *test_set=NULL;
    25 struct razor_package *test_pkg=NULL;
    26 
    27 static void finalize(void)
    28 {
    29     if (test_set)
    30 	razor_set_unref(test_set);
    31 }
    32 
    33 void import_properties(struct razor_importer *importer,
    34   struct razor_set *set,struct razor_package *pkg)
    35 {
    36     struct razor_property_iterator *iter;
    37     struct razor_property *prop;
    38     uint32_t flags;
    39     const char *name,*version;
    40     iter=razor_property_iterator_create(set,pkg);
    41     while(razor_property_iterator_next(iter,&prop,&name,&flags,&version))
    42 	razor_importer_add_property(importer,name,flags,version);
    43     razor_property_iterator_destroy(iter);
    44 }
    45 
    46 void import_files(struct razor_importer *importer,
    47   struct razor_set *set,struct razor_package *pkg)
    48 {
    49     struct razor_file_iterator *iter;
    50     const char *name;
    51     iter=razor_file_iterator_create(set,pkg,FALSE);
    52     while(razor_file_iterator_next(iter,&name))
    53 	razor_importer_add_file(importer,name);
    54     razor_file_iterator_destroy(iter);
    55 }
    56 
    57 gboolean import_rpm(struct razor_rpm *rpm)
    58 {
    59     int i;
    60     struct razor_importer *importer;
    61     struct razor_package_iterator *iter;
    62     struct razor_set *set;
    63     struct razor_package *pkg=NULL;
    64     const char *name,*version,*arch,*summary,*description,*url,*license;
    65     const char *s,*pkg_name;
    66     const char *const *prefixes;
    67     /*
    68      * First pass: get a razor_set and razor_package with everything
    69      * except the prefixes.
    70      */
    71     importer=razor_importer_create();
    72     if (razor_importer_add_rpm(importer,rpm))
    73 	g_error("../yum-repo-test-dir: Failed to add rpm");
    74     set=razor_importer_finish(importer);
    75     if (!set)
    76 	g_error("../yum-repo-test-dir: Failed to import");
    77     iter=razor_package_iterator_create(set);
    78     pkg=NULL;
    79     razor_rpm_get_details(rpm,RAZOR_DETAIL_NAME,&pkg_name,RAZOR_DETAIL_LAST);
    80     while(razor_package_iterator_next(iter,&pkg,RAZOR_DETAIL_NAME,&s,
    81       RAZOR_DETAIL_LAST))
    82 	if (!strcmp(s,pkg_name))
    83 	    break;
    84     razor_package_iterator_destroy(iter);
    85     if (!pkg)
    86     {
    87 	razor_set_unref(set);
    88 	return FALSE;
    89     }
    90     /*
    91      * Second pass: use the information from the first pass plus the
    92      * prefixes to create a final razor_set and razor_package.
    93      */
    94     importer=razor_importer_create();
    95     razor_package_get_details(set,pkg,RAZOR_DETAIL_NAME,&name,
    96       RAZOR_DETAIL_VERSION,&version,RAZOR_DETAIL_ARCH,&arch,
    97       RAZOR_DETAIL_SUMMARY,&summary,RAZOR_DETAIL_DESCRIPTION,&description,
    98       RAZOR_DETAIL_URL,&url,RAZOR_DETAIL_LICENSE,&license,RAZOR_DETAIL_LAST);
    99     razor_importer_begin_package(importer,name,version,arch);
   100     razor_importer_add_details(importer,summary,description,url,license);
   101     import_properties(importer,set,pkg);
   102     import_files(importer,set,pkg);
   103     razor_rpm_get_details(rpm,RAZOR_DETAIL_PREFIXES,&prefixes,
   104       RAZOR_DETAIL_LAST);
   105     for(i=0;prefixes && prefixes[i];i++)
   106 	razor_importer_add_install_prefix(importer,prefixes[i]);
   107     razor_importer_finish_package(importer);
   108     razor_set_unref(set);
   109     test_set=razor_importer_finish(importer);
   110     g_assert(test_set != NULL);
   111     iter=razor_package_iterator_create(test_set);
   112     test_pkg=NULL;
   113     while(razor_package_iterator_next(iter,&test_pkg,RAZOR_DETAIL_NAME,&s,
   114       RAZOR_DETAIL_LAST))
   115 	if (!strcmp(s,pkg_name))
   116 	    break;
   117     razor_package_iterator_destroy(iter);
   118     return !!test_pkg;
   119 }
   120 
   121 static PloverPackage *package_getref(const char *name,const char *version)
   122 {
   123     struct razor_rpm *rpm;
   124     PloverPackage *package=NULL;
   125     struct razor_error *err=NULL;
   126     gchar *filename;
   127     if (test_set)
   128     {
   129 	razor_set_unref(test_set);
   130 	test_set=NULL;
   131     }
   132     /*
   133      * yum metadata doesn't include all the information included in
   134      * a rpm file, so do this the hard way. Unfortunately,
   135      * razor_importer_add_rpm() doesn't support prefixes so we have
   136      * to do it the really hard way.
   137      */
   138     filename=g_strconcat("../yum-repo-test-dir/rpms/",name,"-",version,
   139       ".noarch.rpm",NULL);
   140     rpm=razor_rpm_open(filename,&err);
   141     if (!rpm)
   142 	g_error("%s: %s",filename,razor_error_get_msg(err));
   143     g_free(filename);
   144     if (import_rpm(rpm))
   145 	package=plover_package_new(test_set,test_pkg);
   146     else
   147 	package=NULL;
   148     razor_rpm_close(rpm);
   149     return package;
   150 }
   151 
   152 static void test_basic_properties(void)
   153 {
   154     PloverPackage *package;
   155     package=package_getref("zsh","1-1");
   156     g_assert(package != NULL);
   157     g_assert(plover_package_get_razor_set(package) == test_set);
   158     g_assert(plover_package_get_razor_package(package) == test_pkg);
   159     g_assert_cmpstr(plover_package_get_name(package),==,"zsh");
   160     g_assert_cmpstr(plover_package_get_summary(package),==,"Test package");
   161     g_assert_cmpstr(plover_package_get_version(package),==,"1-1");
   162     g_assert_cmpstr(plover_package_get_license(package),==,"GPL");
   163     g_assert_cmpstr(plover_package_get_arch(package),==,"noarch");
   164     g_assert_cmpstr(plover_package_get_description(package),==,"Test package");
   165     g_assert_cmpstr(plover_package_get_URL(package),==,
   166       "http://www.juiblex.co.uk/beach");
   167     g_object_unref(package);
   168 }
   169 
   170 static void test_package_properties(void)
   171 {
   172     PloverPackage *package;
   173     struct razor_property_iterator *iter;
   174     struct razor_property *prop;
   175     uint32_t flags;
   176     const char *s,*name,*version;
   177     GString *str;
   178     GList *expected,*lnk;
   179     package=package_getref("zsh","1-1");
   180     g_assert(package != NULL);
   181     expected=g_list_prepend(NULL,
   182       (gpointer)g_intern_string("requires(pre,postun): zip"));
   183     expected=g_list_prepend(expected,
   184       (gpointer)g_intern_string("requires: zip"));
   185     expected=g_list_prepend(expected,
   186       (gpointer)g_intern_string("provides: zsh = 1-1"));
   187     iter=plover_package_property_iterator_create(package);
   188     g_assert(iter != NULL);
   189     while(razor_property_iterator_next(iter,&prop,&name,&flags,&version))
   190     {
   191 	if (g_str_has_prefix(name,"rpmlib("))
   192 	    continue;
   193 	s=razor_property_type_to_string(prop);
   194 	g_assert(s != NULL);
   195 	str=g_string_new(s);
   196 	if (flags&RAZOR_PROPERTY_SCRIPT_MASK)
   197 	{
   198 	    g_string_append_c(str,'(');
   199 	    if (flags&RAZOR_PROPERTY_PRE)
   200 		g_string_append(str,"pre");
   201 	    if (flags&RAZOR_PROPERTY_POST)
   202 	    {
   203 		if (str->str[str->len-1]!='(' && str->str[str->len-1]!=',')
   204 		    g_string_append_c(str,',');
   205 		g_string_append(str,"post");
   206 	    }
   207 	    if (flags&RAZOR_PROPERTY_PREUN)
   208 	    {
   209 		if (str->str[str->len-1]!='(' && str->str[str->len-1]!=',')
   210 		    g_string_append_c(str,',');
   211 		g_string_append(str,"preun");
   212 	    }
   213 	    if (flags&RAZOR_PROPERTY_POSTUN)
   214 	    {
   215 		if (str->str[str->len-1]!='(' && str->str[str->len-1]!=',')
   216 		    g_string_append_c(str,',');
   217 		g_string_append(str,"postun");
   218 	    }
   219 	    g_string_append_c(str,')');
   220 	}
   221 	g_string_append(str,": ");
   222 	g_string_append(str,name);
   223 	if (*version)
   224 	{
   225 	    g_string_append_c(str,' ');
   226 	    g_string_append(str,razor_property_relation_to_string(prop));
   227 	    g_string_append_c(str,' ');
   228 	    g_string_append(str,version);
   229 	}
   230 	lnk=g_list_find(expected,g_intern_string(str->str));
   231 	if (!lnk)
   232 	    g_warning("Unexpected property in zsh package: %s",str->str);
   233 	else
   234 	    expected=g_list_delete_link(expected,lnk);
   235 	g_string_free(str,TRUE);
   236     }
   237     razor_property_iterator_destroy(iter);
   238     if (expected)
   239 	g_warning("%d missing propert%s in set, including %s",
   240 	  g_list_length(expected),g_list_length(expected)==1?"y":"ies",
   241 	  expected->data);
   242     g_object_unref(package);
   243 }
   244 
   245 static void test_package_files(void)
   246 {
   247     PloverPackage *package;
   248     struct razor_file_iterator *iter;
   249     const char *name;
   250     GList *expected,*lnk;
   251     package=package_getref("zsh","1-1");
   252     g_assert(package != NULL);
   253     expected=g_list_prepend(NULL,(gpointer)g_intern_string("/etc/zsh.conf"));
   254     expected=g_list_prepend(expected,(gpointer)g_intern_string("/usr/bin/zsh"));
   255     iter=plover_package_file_iterator_create(package,FALSE);
   256     g_assert(iter != NULL);
   257     while(razor_file_iterator_next(iter,&name))
   258     {
   259 	lnk=g_list_find(expected,g_intern_string(name));
   260 	if (!lnk)
   261 	    g_warning("Unexpected file in zsh package: %s",name);
   262 	else
   263 	    expected=g_list_delete_link(expected,lnk);
   264     }
   265     razor_file_iterator_destroy(iter);
   266     if (expected)
   267 	g_warning("%d missing file%s in set, including %s",
   268 	  g_list_length(expected),g_list_length(expected)==1?"":"s",
   269 	  expected->data);
   270     g_object_unref(package);
   271 }
   272 
   273 static void test_package_icon(void)
   274 {
   275     /*
   276      * icons aren't supported yet.
   277      */
   278     PloverPackage *package;
   279     GInputStream *stream;
   280     GError *err=NULL;
   281     package=package_getref("zsh","1-1");
   282     g_assert(package != NULL);
   283     stream=plover_package_read_icon(package,&err);
   284     if (stream)
   285     {
   286 	/* Unexpected, but hardly an error */
   287 	g_object_unref(stream);
   288     }
   289     else
   290     {
   291 	g_assert(err != NULL);
   292 	g_assert(err->message != NULL);
   293 	g_error_free(err);
   294     }
   295     g_object_unref(package);
   296 }
   297 
   298 static void test_package_prefixes(void)
   299 {
   300     PloverPackage *package;
   301     const char *const *prefixes;
   302     package=package_getref("zsh","1-1");
   303     g_assert(package != NULL);
   304     prefixes=plover_package_get_prefixes(package);
   305     g_assert_cmpstr(prefixes[0], ==, "/usr");
   306     g_assert(prefixes[1] == NULL);
   307     g_object_unref(package);
   308 }
   309 
   310 int main(int argc,char **argv)
   311 {
   312     int retval;
   313     g_test_init(&argc,&argv,NULL);
   314     g_test_bug_base("mailto:ali@juiblex.co.uk");
   315     g_test_add_func("/package/basic",test_basic_properties);
   316     g_test_add_func("/package/icons",test_package_icon);
   317     g_test_add_func("/package/properties",test_package_properties);
   318     g_test_add_func("/package/files",test_package_files);
   319     g_test_add_func("/package/prefixes",test_package_prefixes);
   320     g_test_message("PloverPackage::changed signal unused and thus untestable");
   321     retval=g_test_run();
   322     finalize();
   323     return retval;
   324 }