tests/plover-gtk/test-packagestore.c
author J. Ali Harlow <ali@juiblex.co.uk>
Sat Jul 16 11:07:18 2016 +0100 (2016-07-16)
changeset 61 31fb35727621
permissions -rw-r--r--
Support parallel installations. The idea is that for CAD screener, we want
to be able to install this on the same machine as a standard AVOT setup
(most notably for John's laptop). To allow for the possibility of a second
application that might have the same requirements, we add the concept of
vendor-specific distributions. Thus we can have one distribution for CAD
screener and one for The Next Big Thing. It doesn't seem trivial to have
both CAD screener and AVOT under the same vendor tag so we'll have to have
AVOT under "City Occupational" and CAD screener under "City Occupational Ltd"
or some such kludge.

Most of this is done although we are very short of test cases (in particular
we don't test that it's actually possible to install CAD screener in parallel
with AVOT or to update either of them once installed, which is fundamental).

We also have a lot of baggage left over, including an intercept of razor_set.
The problem that this was introduced to debug has been fixed but it looks
like there are a number of memory leaks which it might be useful to help
track down so it has been left in place for now.

There is still a lot of confusion in plover between path-based and URI-based
API. We should review the API, decide what we want and have a general clear up.

There is also confusion as to the purpose of RAZOR_ROOT (and meaning; path or
URI). This is not used at all in librazor (although it is used in razor.exe).
Ideally we shouldn't use it in plover or plover-gtk either although again, we
might want to support it or an equivalent in (some of) the various executables.

Work that would still to nice to do for CAD screener:

- uninstall (ideally as an installed program that hooks into Add/Remove programs
but even re-running the installer would be acceptable).
- xz support (smaller packages).
- repomd.xml and xml:base (would be needed for an Internet installer).
- graphical installer.
     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 <string.h>
    21 #include <glib.h>
    22 #include <gdk/gdk.h>
    23 #include <gtk/gtk.h>
    24 #include <razor/razor.h>
    25 #include <plover/package.h>
    26 #include <plover/packageset.h>
    27 #include <plover-gtk/packagestore.h>
    28 #include "treemodel.h"
    29 
    30 static void verify_package_store(PloverPackageStore *store,
    31   GSList *expected_packages)
    32 {
    33     int i;
    34     const char *s;
    35     gchar *nosummary;
    36     PloverPackage *package;
    37     PloverPackageSet *package_set;
    38     GtkTreeModel *model;
    39     GtkTreeIter iter;
    40     GValue value={0,};
    41     GSList *expected,*lnk;
    42     GdkPixbuf *icon;
    43     model=GTK_TREE_MODEL(store);
    44     test_tree_model(model);
    45     expected=g_slist_copy(expected_packages);
    46     g_assert_cmpint(gtk_tree_model_get_n_columns(model),==,PLOVER_PACKAGE_STORE_NO_COLUMNS);
    47     g_assert_cmpint(gtk_tree_model_get_column_type(model,PLOVER_PACKAGE_STORE_OBJ_COLUMN),==,PLOVER_TYPE_PACKAGE);
    48     g_assert_cmpint(gtk_tree_model_get_column_type(model,PLOVER_PACKAGE_STORE_INSTALLED_COLUMN),==,G_TYPE_BOOLEAN);
    49     g_assert_cmpint(gtk_tree_model_get_column_type(model,PLOVER_PACKAGE_STORE_ICON_COLUMN),==,GDK_TYPE_PIXBUF);
    50     g_assert_cmpint(gtk_tree_model_get_column_type(model,PLOVER_PACKAGE_STORE_NAME_COLUMN),==,G_TYPE_STRING);
    51     g_assert_cmpint(gtk_tree_model_get_column_type(model,PLOVER_PACKAGE_STORE_VERSION_COLUMN),==,G_TYPE_STRING);
    52     g_assert_cmpint(gtk_tree_model_get_column_type(model,PLOVER_PACKAGE_STORE_SUMMARY_COLUMN),==,G_TYPE_STRING);
    53     for(i=0;;i++)
    54     {
    55 	if (!gtk_tree_model_iter_nth_child(model,&iter,NULL,i))
    56 	    break;
    57 	gtk_tree_model_get_value(model,&iter,PLOVER_PACKAGE_STORE_OBJ_COLUMN,
    58 	  &value);
    59 	package=g_value_dup_object(&value);
    60 	lnk=g_slist_find(expected,package);
    61 	if (!lnk)
    62 	    g_warning("Unexpected package in store: %s",
    63 	      plover_package_get_name(package));
    64 	else
    65 	{
    66 	    g_object_unref(lnk->data);
    67 	    expected=g_slist_delete_link(expected,lnk);
    68 	}
    69 	g_value_unset(&value);
    70 	gtk_tree_model_get_value(model,&iter,
    71 	  PLOVER_PACKAGE_STORE_INSTALLED_COLUMN,&value);
    72 	g_assert_cmpint(G_VALUE_TYPE(&value),==,G_TYPE_BOOLEAN);
    73 	/* Can't check value of installed yet, it
    74 	 * isn't set (or even properly defined).
    75 	 */
    76 	g_value_unset(&value);
    77 	gtk_tree_model_get_value(model,&iter,
    78 	  PLOVER_PACKAGE_STORE_ICON_COLUMN,&value);
    79 	icon=g_value_get_object(&value);
    80 	if (icon)
    81 	    g_assert(GDK_IS_PIXBUF(icon));
    82 	g_value_unset(&value);
    83 	gtk_tree_model_get_value(model,&iter,PLOVER_PACKAGE_STORE_NAME_COLUMN,
    84 	  &value);
    85 	s=g_value_get_string(&value);
    86 	g_assert_cmpstr(plover_package_get_name(package),==,s);
    87 	g_value_unset(&value);
    88 	gtk_tree_model_get_value(model,&iter,
    89 	  PLOVER_PACKAGE_STORE_VERSION_COLUMN,&value);
    90 	s=g_value_get_string(&value);
    91 	g_assert_cmpstr(plover_package_get_version(package),==,s);
    92 	g_value_unset(&value);
    93 	gtk_tree_model_get_value(model,&iter,
    94 	  PLOVER_PACKAGE_STORE_SUMMARY_COLUMN,&value);
    95 	s=g_value_get_string(&value);
    96 	if (*plover_package_get_summary(package))
    97 	    g_assert_cmpstr(plover_package_get_summary(package),==,s);
    98 	else
    99 	{
   100 	    nosummary=g_strconcat("The ",plover_package_get_name(package),
   101 	      " package",NULL);
   102 	    g_assert_cmpstr(nosummary,==,s);
   103 	    g_free(nosummary);
   104 	}
   105 	g_value_unset(&value);
   106     }
   107     if (expected)
   108     {
   109 	package=PLOVER_PACKAGE(expected->data);
   110 	g_warning("%d missing package%s in store, including %s",
   111 	  g_slist_length(expected),g_slist_length(expected)==1?"":"s",
   112 	  plover_package_get_name(package));
   113     }
   114 }
   115 
   116 static void test_empty(void)
   117 {
   118     PloverPackageStore *store;
   119     store=plover_package_store_new();
   120     g_assert(!plover_package_store_get_sets(store));
   121     verify_package_store(store,NULL);
   122     g_object_unref(store);
   123 }
   124 
   125 static void test_basic(void)
   126 {
   127     PloverPackageSet *package_set;
   128     PloverPackageStore *store;
   129     GError *err=NULL;
   130     GSList *expected;
   131     package_set=plover_package_set_new_from_yum("../yum-repo-test-dir",NULL,
   132       &err);
   133     if (!package_set)
   134 	g_error("../yum-repo-test-dir: %s",err->message);
   135     store=plover_package_store_new();
   136     plover_package_store_add_set(store,package_set);
   137     expected=g_slist_copy(plover_package_set_get_packages(package_set));
   138     g_slist_foreach(expected,(GFunc)g_object_ref,NULL);
   139     g_object_unref(package_set);
   140     verify_package_store(store,expected);
   141     g_slist_foreach(expected,(GFunc)g_object_unref,NULL);
   142     g_slist_free(expected);
   143     g_object_unref(store);
   144 }
   145 
   146 static PloverPackageSet *no_details_new(void)
   147 {
   148     struct razor_set *set;
   149     struct razor_importer *importer;
   150     PloverPackageSet *package_set;
   151     importer=razor_importer_create();
   152     razor_importer_begin_package(importer,"no-details","1-1","noarch");
   153     razor_importer_add_details(importer,"","","","");
   154     razor_importer_add_property(importer,"no-details",
   155       RAZOR_PROPERTY_PROVIDES|RAZOR_PROPERTY_EQUAL,"1-1");
   156     razor_importer_finish_package(importer);
   157     set=razor_importer_finish(importer);
   158     package_set=plover_package_set_new_from_razor(set);
   159     razor_set_unref(set);
   160     return package_set;
   161 }
   162 
   163 static void test_no_details(void)
   164 {
   165     PloverPackageSet *package_set;
   166     PloverPackageStore *store;
   167     GSList *expected;
   168     package_set=no_details_new();
   169     store=plover_package_store_new();
   170     plover_package_store_add_set(store,package_set);
   171     expected=g_slist_copy(plover_package_set_get_packages(package_set));
   172     g_slist_foreach(expected,(GFunc)g_object_ref,NULL);
   173     g_object_unref(package_set);
   174     verify_package_store(store,expected);
   175     g_slist_foreach(expected,(GFunc)g_object_unref,NULL);
   176     g_slist_free(expected);
   177     g_object_unref(store);
   178 }
   179 
   180 static void test_remove(void)
   181 {
   182     PloverPackageSet *yum_set,*nodetails_set;
   183     PloverPackageStore *store;
   184     GSList *expected;
   185     GError *err=NULL;
   186     store=plover_package_store_new();
   187     yum_set=plover_package_set_new_from_yum("../yum-repo-test-dir",NULL,&err);
   188     if (!yum_set)
   189 	g_error("../yum-repo-test-dir: %s",err->message);
   190     plover_package_store_add_set(store,yum_set);
   191     nodetails_set=no_details_new();
   192     expected=g_slist_copy(plover_package_set_get_packages(nodetails_set));
   193     g_slist_foreach(expected,(GFunc)g_object_ref,NULL);
   194     plover_package_store_add_set(store,nodetails_set);
   195     plover_package_store_remove_set(store,yum_set);
   196     g_object_unref(nodetails_set);
   197     g_object_unref(yum_set);
   198     verify_package_store(store,expected);
   199     g_slist_foreach(expected,(GFunc)g_object_unref,NULL);
   200     g_slist_free(expected);
   201     g_object_unref(store);
   202 }
   203 
   204 int main(int argc,char **argv)
   205 {
   206     int retval;
   207     gtk_test_init(&argc,&argv,NULL);
   208     g_test_bug_base("mailto:ali@juiblex.co.uk");
   209     g_test_add_func("/packagestore/empty",test_empty);
   210     g_test_add_func("/packagestore/basic",test_basic);
   211     g_test_add_func("/packagestore/no-details",test_no_details);
   212     g_test_add_func("/packagestore/remove",test_remove);
   213     retval=g_test_run();
   214     return retval;
   215 }