tests/plover-gtk/test-transactionhelper.c
author J. Ali Harlow <ali@juiblex.co.uk>
Thu Jun 16 12:11:14 2016 +0100 (2016-06-16)
changeset 42 419a02fa70db
parent 38 a29623b68ca2
child 61 31fb35727621
permissions -rw-r--r--
Port to razor 0.6.3.59
     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 <locale.h>
    22 #include <sys/stat.h>
    23 #include <glib.h>
    24 #include <gdk/gdk.h>
    25 #include <gtk/gtk.h>
    26 #include <plover/plover.h>
    27 #include <plover-gtk/transactionhelper.h>
    28 
    29 GtkBuilder *ui;
    30 gboolean manual_mode=FALSE;
    31 
    32 PloverTransactionHelper *get_transaction_helper(void)
    33 {
    34     const char *dir;
    35     gchar *s;
    36     GError *err=NULL;
    37     PloverTransactionHelper *helper;
    38     dir=g_getenv("gtk_srcdir");
    39     s=g_build_filename(dir,"software-installation.ui",NULL);
    40     ui=gtk_builder_new();
    41     if (!gtk_builder_add_from_file(ui,s,&err))
    42 	g_error("%s: %s",s,err->message);
    43     g_free(s);
    44     helper=plover_transaction_helper_new(ui);
    45     g_object_unref(ui);
    46     return helper;
    47 }
    48 
    49 static void test_init(void)
    50 {
    51     PloverTransactionHelper *helper;
    52     helper=get_transaction_helper();
    53     g_object_unref(helper);
    54 }
    55 
    56 static void test_basic_properties(void)
    57 {
    58     const char *prefix;
    59     GError *err=NULL;
    60     struct comps *comps;
    61     PloverTransactionHelper *helper;
    62     PloverPackageSet *installed;
    63     PloverRepository *upstream;
    64     upstream=plover_repository_new_from_yum("../yum-repo-test-dir",&err);
    65     if (!upstream)
    66 	g_error("../yum-repo-test-dir: %s",err->message);
    67     installed=plover_package_set_new_from_installed("../razor-test-dir",&err);
    68     if (!installed)
    69 	g_error("../razor-test-dir: %s",err->message);
    70     helper=get_transaction_helper();
    71     g_assert(!plover_transaction_helper_get_visible(helper));
    72     plover_transaction_helper_set_installed(helper,installed);
    73     g_assert(plover_transaction_helper_get_installed(helper)==installed);
    74     plover_transaction_helper_set_upstream(helper,upstream);
    75     g_assert(plover_transaction_helper_get_upstream(helper,&err)==upstream);
    76     g_assert(!err);
    77     plover_transaction_helper_set_base(helper,"../yum-repo-test-dir");
    78     g_assert_cmpstr(plover_transaction_helper_get_base(helper),==,"../yum-repo-test-dir");
    79     comps=plover_transaction_helper_get_comps(helper,&err);
    80     g_assert(!err);
    81     g_assert(plover_comps_lookup_group(comps,"base"));
    82     prefix=plover_transaction_helper_get_prefix(helper,&err);
    83     g_assert(!err);
    84     g_assert_cmpstr(prefix,==,plover_default_prefix_for_vendor("Acme Corporation"));
    85     g_assert(!plover_transaction_helper_get_visible(helper));
    86     g_assert(!plover_transaction_helper_get_error(helper,NULL));
    87     g_object_unref(upstream);
    88     g_object_unref(installed);
    89     g_object_unref(helper);
    90 }
    91 
    92 static void test_install_group(void)
    93 {
    94     gchar *root,*root_uri;
    95     GError *err=NULL;
    96     GFile *file;
    97     PloverPackageSet *installed;
    98     PloverTransactionHelper *helper;
    99     root=g_strdup("razor-test-dir-XXXXXX");
   100     g_assert(mkdtemp(root));
   101     file=g_file_new_for_path(root);
   102     g_free(root);
   103     root_uri=g_file_get_uri(file);
   104     g_object_unref(file);
   105     g_setenv("RAZOR_ROOT",root_uri,TRUE);
   106     g_free(root_uri);
   107     helper=get_transaction_helper();
   108     installed=plover_package_set_new_from_installed("../razor-test-dir",&err);
   109     if (!installed)
   110 	g_error("../razor-test-dir: %s",err->message);
   111     plover_transaction_helper_set_installed(helper,installed);
   112     g_object_unref(installed);
   113     plover_transaction_helper_set_base(helper,"../yum-repo-test-dir");
   114     if (!plover_transaction_helper_install_group(helper,"base",&err))
   115 	g_error("base: %s",err->message);
   116     g_assert(!err);
   117     g_object_unref(helper);
   118     g_unsetenv("RAZOR_ROOT");
   119 }
   120 
   121 static void test_remove_group(void)
   122 {
   123     gchar *root,*root_uri;
   124     GError *err=NULL;
   125     GFile *file;
   126     PloverPackageSet *installed;
   127     PloverTransactionHelper *helper;
   128     struct plover_vector *packages;
   129     char *pkgs[]={"zip",NULL};
   130     root=g_strdup("razor-test-dir-XXXXXX");
   131     g_assert(mkdtemp(root));
   132     file=g_file_new_for_path(root);
   133     root_uri=g_file_get_uri(file);
   134     g_object_unref(file);
   135     g_setenv("RAZOR_ROOT",root_uri,TRUE);
   136     g_free(root_uri);
   137     helper=get_transaction_helper();
   138     plover_transaction_helper_set_base(helper,"../yum-repo-test-dir");
   139     packages=plover_transaction_helper_group_get_default_packages(helper,
   140       "zappy",&err);
   141     if (!packages)
   142 	g_error("zappy: %s",err->message);
   143     if (!plover_install("../yum-repo-test-dir",NULL,packages->strings,&err))
   144 	g_error("plover_install: %s",err->message);
   145     plover_vector_free(packages);
   146     installed=plover_package_set_new_from_installed(root,&err);
   147     if (!installed)
   148 	g_error("%s: %s",root,err->message);
   149     plover_transaction_helper_set_installed(helper,installed);
   150     g_object_unref(installed);
   151     if (!plover_transaction_helper_remove_group(helper,"zappy",&err))
   152 	g_error("zappy: %s",err->message);
   153     g_assert(!err);
   154     g_object_unref(helper);
   155     g_unsetenv("RAZOR_ROOT");
   156     g_free(root);
   157 }
   158 
   159 static void test_update(void)
   160 {
   161     gchar *root,*root_uri;
   162     GError *err=NULL;
   163     GFile *file;
   164     PloverPackageSet *installed;
   165     PloverTransactionHelper *helper;
   166     root=g_strdup("razor-test-dir-XXXXXX");
   167     g_assert(mkdtemp(root));
   168     file=g_file_new_for_path(root);
   169     g_free(root);
   170     root_uri=g_file_get_uri(file);
   171     g_object_unref(file);
   172     g_setenv("RAZOR_ROOT",root_uri,TRUE);
   173     g_free(root_uri);
   174     helper=get_transaction_helper();
   175     installed=plover_package_set_new_from_installed("../razor-test-dir",&err);
   176     if (!installed)
   177 	g_error("../razor-test-dir: %s",err->message);
   178     plover_transaction_helper_set_installed(helper,installed);
   179     g_object_unref(installed);
   180     plover_transaction_helper_set_base(helper,"../yum-repo-test-dir");
   181     if (plover_transaction_helper_update(helper,&err))
   182 	g_error("plover_transaction_helper_update reports work to be done");
   183     g_assert_error(err,PLOVER_GENERAL_ERROR,PLOVER_GENERAL_ERROR_NO_WORK);
   184     g_object_unref(helper);
   185     g_unsetenv("RAZOR_ROOT");
   186 }
   187 
   188 struct run_install_baton {
   189     enum {
   190 	RI_STATE_INIT = 0,
   191 	RI_STATE_SUMMARY,
   192 	RI_STATE_PROGRESS,
   193 	RI_STATE_PROGRESS_DELAY,
   194 	RI_STATE_DONE,
   195 	RI_STATE_FINISH
   196     } state;
   197     guint eid;		/* event ID (or 0) */
   198     PloverTransactionHelper *helper;
   199 };
   200 
   201 gboolean run_install_tick(gpointer data)
   202 {
   203     gboolean retval=TRUE;
   204     struct run_install_baton *baton=data;
   205     GtkWidget *page;
   206     GtkAssistant *assistant=baton->helper->assistant;
   207     switch(baton->state)
   208     {
   209 	case RI_STATE_INIT:
   210 	    if (!assistant || !gtk_widget_get_visible(GTK_WIDGET(assistant)))
   211 		return TRUE;
   212 	    if (!manual_mode)
   213 		gtk_button_clicked(GTK_BUTTON(assistant->forward));
   214 	    break;
   215 	case RI_STATE_SUMMARY:
   216 	    if (gtk_assistant_get_current_page(assistant)<1)
   217 		return TRUE;
   218 	    if (!manual_mode)
   219 		gtk_button_clicked(GTK_BUTTON(assistant->apply));
   220 	    break;
   221 	case RI_STATE_PROGRESS:
   222 	    if (gtk_assistant_get_current_page(assistant)<2)
   223 		return TRUE;
   224 	    page=gtk_assistant_get_nth_page(assistant,2);
   225 	    baton->eid=g_timeout_add_seconds(1,run_install_tick,baton);
   226 	    if (!gtk_assistant_get_page_complete(assistant,page))
   227 		return FALSE;
   228 	    else
   229 		retval=FALSE;
   230 	    break;
   231 	case RI_STATE_PROGRESS_DELAY:
   232 	    retval=FALSE;
   233 	    baton->eid=g_idle_add_full(G_PRIORITY_LOW,run_install_tick,baton,
   234 	      NULL);
   235 	    if (!manual_mode)
   236 		gtk_button_clicked(GTK_BUTTON(assistant->forward));
   237 	    break;
   238 	case RI_STATE_DONE:
   239 	    if (gtk_assistant_get_current_page(assistant)<3)
   240 		return TRUE;
   241 	    if (!manual_mode)
   242 		gtk_button_clicked(GTK_BUTTON(assistant->close));
   243 	    break;
   244 	case RI_STATE_FINISH:
   245 	    if (assistant && gtk_widget_get_visible(GTK_WIDGET(assistant)))
   246 		return TRUE;
   247 	    gtk_main_quit();
   248 	    baton->eid=0;
   249 	    return FALSE;
   250     }
   251     baton->state++;
   252     return retval;
   253 }
   254 
   255 static void test_run_install(void)
   256 {
   257     gchar *root,*root_uri;
   258     GError *err=NULL;
   259     GFile *file;
   260     struct plover_vector *packages;
   261     PloverPackageSet *installed;
   262     PloverTransactionHelper *helper;
   263     struct run_install_baton baton={0,};
   264     root=g_strdup("razor-test-dir-XXXXXX");
   265     g_assert(mkdtemp(root));
   266     file=g_file_new_for_path(root);
   267     root_uri=g_file_get_uri(file);
   268     g_object_unref(file);
   269     g_setenv("RAZOR_ROOT",root_uri,TRUE);
   270     g_free(root_uri);
   271     helper=get_transaction_helper();
   272     installed=plover_package_set_new();
   273     if (!plover_package_set_open(installed,root,TRUE,&err))
   274 	g_error("%s: %s",root,err->message);
   275     plover_transaction_helper_set_installed(helper,installed);
   276     g_object_unref(installed);
   277     plover_transaction_helper_set_base(helper,"../yum-repo-test-dir");
   278     packages=plover_vector_new();
   279     plover_vector_append(packages,"zappy-tools");
   280     if (!plover_transaction_helper_install_packages(helper,packages,&err))
   281 	g_error("zappy-tools: %s",err->message);
   282     g_assert(!err);
   283     plover_vector_free(packages);
   284     plover_transaction_helper_present(helper);
   285     baton.helper=helper;
   286     baton.eid=g_idle_add_full(G_PRIORITY_LOW,run_install_tick,&baton,NULL);
   287     gtk_main();
   288     g_object_unref(helper);
   289     g_unsetenv("RAZOR_ROOT");
   290     g_free(root);
   291 }
   292 
   293 struct run_remove_baton {
   294     enum {
   295 	RR_STATE_INIT = 0,
   296 	RR_STATE_SUMMARY,
   297 	RR_STATE_PROGRESS,
   298 	RR_STATE_PROGRESS_DELAY,
   299 	RR_STATE_DONE,
   300 	RR_STATE_FINISH
   301     } state;
   302     guint eid;		/* event ID (or 0) */
   303     PloverTransactionHelper *helper;
   304 };
   305 
   306 gboolean run_remove_tick(gpointer data)
   307 {
   308     gboolean retval=TRUE;
   309     struct run_remove_baton *baton=data;
   310     GtkWidget *page;
   311     GtkAssistant *assistant=baton->helper->assistant;
   312     switch(baton->state)
   313     {
   314 	case RR_STATE_INIT:
   315 	    if (!assistant || !gtk_widget_get_visible(GTK_WIDGET(assistant)))
   316 		return TRUE;
   317 	    if (!manual_mode)
   318 		gtk_button_clicked(GTK_BUTTON(assistant->forward));
   319 	    break;
   320 	case RR_STATE_SUMMARY:
   321 	    if (gtk_assistant_get_current_page(assistant)<1)
   322 		return TRUE;
   323 	    if (!manual_mode)
   324 		gtk_button_clicked(GTK_BUTTON(assistant->apply));
   325 	    break;
   326 	case RR_STATE_PROGRESS:
   327 	    if (gtk_assistant_get_current_page(assistant)<2)
   328 		return TRUE;
   329 	    page=gtk_assistant_get_nth_page(assistant,2);
   330 	    baton->eid=g_timeout_add_seconds(1,run_remove_tick,baton);
   331 	    if (!gtk_assistant_get_page_complete(assistant,page))
   332 		return FALSE;
   333 	    else
   334 		retval=FALSE;
   335 	    break;
   336 	case RR_STATE_PROGRESS_DELAY:
   337 	    retval=FALSE;
   338 	    baton->eid=g_idle_add_full(G_PRIORITY_LOW,run_remove_tick,baton,
   339 	      NULL);
   340 	    if (!manual_mode)
   341 		gtk_button_clicked(GTK_BUTTON(assistant->forward));
   342 	    break;
   343 	case RR_STATE_DONE:
   344 	    if (gtk_assistant_get_current_page(assistant)<3)
   345 		return TRUE;
   346 	    if (!manual_mode)
   347 		gtk_button_clicked(GTK_BUTTON(assistant->close));
   348 	    break;
   349 	case RR_STATE_FINISH:
   350 	    if (assistant && gtk_widget_get_visible(GTK_WIDGET(assistant)))
   351 		return TRUE;
   352 	    gtk_main_quit();
   353 	    baton->eid=0;
   354 	    return FALSE;
   355     }
   356     baton->state++;
   357     return retval;
   358 }
   359 
   360 static void test_run_remove(void)
   361 {
   362     gchar *root,*root_uri;
   363     GError *err=NULL;
   364     GFile *file;
   365     struct plover_vector *packages;
   366     PloverPackageSet *installed;
   367     PloverTransactionHelper *helper;
   368     struct run_remove_baton baton={0,};
   369     root=g_strdup("razor-test-dir-XXXXXX");
   370     g_assert(mkdtemp(root));
   371     file=g_file_new_for_path(root);
   372     root_uri=g_file_get_uri(file);
   373     g_object_unref(file);
   374     g_setenv("RAZOR_ROOT",root_uri,TRUE);
   375     g_free(root_uri);
   376     helper=get_transaction_helper();
   377     plover_transaction_helper_set_base(helper,"../yum-repo-test-dir");
   378     packages=
   379       plover_transaction_helper_group_get_default_packages(helper,"zappy",&err);
   380     if (!packages)
   381 	g_error("zappy: %s",err->message);
   382     if (!plover_install("../yum-repo-test-dir",NULL,packages->strings,&err))
   383 	g_error("plover_install: %s",err->message);
   384     plover_vector_free(packages);
   385     installed=plover_package_set_new();
   386     if (!plover_package_set_open(installed,root,TRUE,&err))
   387 	g_error("%s: %s",root,err->message);
   388     plover_transaction_helper_set_installed(helper,installed);
   389     g_object_unref(installed);
   390     if (!plover_transaction_helper_remove_group(helper,"zappy",&err))
   391 	g_error("zappy: %s",err->message);
   392     g_assert(!err);
   393     plover_transaction_helper_present(helper);
   394     baton.helper=helper;
   395     baton.eid=g_idle_add_full(G_PRIORITY_LOW,run_remove_tick,&baton,NULL);
   396     gtk_main();
   397     g_object_unref(helper);
   398     g_unsetenv("RAZOR_ROOT");
   399     g_free(root);
   400 }
   401 
   402 struct run_update_baton {
   403     enum {
   404 	RU_STATE_INIT = 0,
   405 	RU_STATE_SUMMARY,
   406 	RU_STATE_PROGRESS,
   407 	RU_STATE_PROGRESS_DELAY,
   408 	RU_STATE_DONE,
   409 	RU_STATE_FINISH
   410     } state;
   411     guint eid;		/* event ID (or 0) */
   412     PloverTransactionHelper *helper;
   413 };
   414 
   415 gboolean run_update_tick(gpointer data)
   416 {
   417     gboolean retval=TRUE;
   418     struct run_update_baton *baton=data;
   419     GtkWidget *page;
   420     GtkAssistant *assistant=baton->helper->assistant;
   421     switch(baton->state)
   422     {
   423 	case RU_STATE_INIT:
   424 	    if (!assistant || !gtk_widget_get_visible(GTK_WIDGET(assistant)))
   425 		return TRUE;
   426 	    if (!manual_mode)
   427 		gtk_button_clicked(GTK_BUTTON(assistant->forward));
   428 	    break;
   429 	case RU_STATE_SUMMARY:
   430 	    if (gtk_assistant_get_current_page(assistant)<1)
   431 		return TRUE;
   432 	    if (!manual_mode)
   433 		gtk_button_clicked(GTK_BUTTON(assistant->apply));
   434 	    break;
   435 	case RU_STATE_PROGRESS:
   436 	    if (gtk_assistant_get_current_page(assistant)<2)
   437 		return TRUE;
   438 	    page=gtk_assistant_get_nth_page(assistant,2);
   439 	    baton->eid=g_timeout_add_seconds(1,run_update_tick,baton);
   440 	    if (!gtk_assistant_get_page_complete(assistant,page))
   441 		return FALSE;
   442 	    else
   443 		retval=FALSE;
   444 	    break;
   445 	case RU_STATE_PROGRESS_DELAY:
   446 	    retval=FALSE;
   447 	    baton->eid=g_idle_add_full(G_PRIORITY_LOW,run_update_tick,baton,
   448 	      NULL);
   449 	    if (!manual_mode)
   450 		gtk_button_clicked(GTK_BUTTON(assistant->forward));
   451 	    break;
   452 	case RU_STATE_DONE:
   453 	    if (gtk_assistant_get_current_page(assistant)<3)
   454 		return TRUE;
   455 	    if (!manual_mode)
   456 		gtk_button_clicked(GTK_BUTTON(assistant->close));
   457 	    break;
   458 	case RU_STATE_FINISH:
   459 	    if (assistant && gtk_widget_get_visible(GTK_WIDGET(assistant)))
   460 		return TRUE;
   461 	    gtk_main_quit();
   462 	    baton->eid=0;
   463 	    return FALSE;
   464     }
   465     baton->state++;
   466     return retval;
   467 }
   468 
   469 static void test_run_update(void)
   470 {
   471     gchar *root,*root_uri;
   472     GError *err=NULL;
   473     GFile *file;
   474     struct razor_importer *importer;
   475     struct razor_set *downgraded;
   476     struct razor_atomic *atomic;
   477     struct plover_vector *packages;
   478     PloverPackageSet *installed;
   479     PloverTransactionHelper *helper;
   480     struct run_update_baton baton={0,};
   481     root=g_strdup("razor-test-dir-XXXXXX");
   482     g_assert(mkdtemp(root));
   483     file=g_file_new_for_path(root);
   484     root_uri=g_file_get_uri(file);
   485     g_object_unref(file);
   486     g_setenv("RAZOR_ROOT",root_uri,TRUE);
   487     g_free(root_uri);
   488     helper=get_transaction_helper();
   489     plover_transaction_helper_set_base(helper,"../yum-repo-test-dir");
   490     installed=plover_package_set_new();
   491     if (!plover_package_set_open(installed,root,TRUE,&err))
   492 	g_error("%s: %s",root,err->message);
   493     importer=razor_importer_create();
   494     razor_importer_begin_package(importer,"zappy","0-1","noarch");
   495     razor_importer_add_details(importer,"","","","");
   496     razor_importer_add_property(importer,"zappy",RAZOR_PROPERTY_PROVIDES,"0-1");
   497     razor_importer_finish_package(importer);
   498     downgraded=razor_importer_finish(importer);
   499     atomic=razor_atomic_open("Add downgraded packages");
   500     if (!plover_package_set_update(installed,downgraded,atomic) ||
   501       razor_atomic_commit(atomic))
   502 	g_error("%s: %s",root,razor_atomic_get_error_msg(atomic));
   503     razor_atomic_destroy(atomic);
   504     razor_set_unref(downgraded);
   505     plover_transaction_helper_set_installed(helper,installed);
   506     g_object_unref(installed);
   507     if (!plover_transaction_helper_update(helper,&err))
   508 	g_error("update: %s",err->message);
   509     g_assert(!err);
   510     plover_transaction_helper_present(helper);
   511     baton.helper=helper;
   512     baton.eid=g_idle_add_full(G_PRIORITY_LOW,run_update_tick,&baton,NULL);
   513     gtk_main();
   514     g_object_unref(helper);
   515     g_unsetenv("RAZOR_ROOT");
   516     g_free(root);
   517 }
   518 
   519 struct check_vendor_baton {
   520     enum {
   521 	CV_STATE_INIT = 0,
   522 	CV_STATE_SUMMARY,
   523 	CV_STATE_PROGRESS,
   524 	CV_STATE_PROGRESS_DELAY,
   525 	CV_STATE_DONE,
   526 	CV_STATE_FINISH
   527     } state;
   528     guint eid;		/* event ID (or 0) */
   529     PloverTransactionHelper *helper;
   530 };
   531 
   532 gboolean check_vendor_tick(gpointer data)
   533 {
   534     gboolean retval=TRUE;
   535     struct check_vendor_baton *baton=data;
   536     GtkWidget *page,*w;
   537     GtkAssistant *assistant=baton->helper->assistant;
   538     switch(baton->state)
   539     {
   540 	case CV_STATE_INIT:
   541 	    if (!assistant || !gtk_widget_get_visible(GTK_WIDGET(assistant)))
   542 		return TRUE;
   543 	    if (!manual_mode)
   544 		gtk_button_clicked(GTK_BUTTON(assistant->forward));
   545 	    break;
   546 	case CV_STATE_SUMMARY:
   547 	    if (gtk_assistant_get_current_page(assistant)<1)
   548 		return TRUE;
   549 	    g_assert(!gtk_widget_is_sensitive(assistant->apply));
   550 	    w=GTK_WIDGET(gtk_builder_get_object(ui,"SIRemoveExisting"));
   551 	    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w),TRUE);
   552 	    g_assert(gtk_widget_is_sensitive(assistant->apply));
   553 	    if (!manual_mode)
   554 		gtk_button_clicked(GTK_BUTTON(assistant->apply));
   555 	    break;
   556 	case CV_STATE_PROGRESS:
   557 	    if (gtk_assistant_get_current_page(assistant)<2)
   558 		return TRUE;
   559 	    page=gtk_assistant_get_nth_page(assistant,2);
   560 	    baton->eid=g_timeout_add_seconds(1,check_vendor_tick,baton);
   561 	    if (!gtk_assistant_get_page_complete(assistant,page))
   562 		return FALSE;
   563 	    else
   564 		retval=FALSE;
   565 	    break;
   566 	case CV_STATE_PROGRESS_DELAY:
   567 	    retval=FALSE;
   568 	    baton->eid=g_idle_add_full(G_PRIORITY_LOW,check_vendor_tick,baton,
   569 	      NULL);
   570 	    if (!manual_mode)
   571 		gtk_button_clicked(GTK_BUTTON(assistant->forward));
   572 	    break;
   573 	case CV_STATE_DONE:
   574 	    if (gtk_assistant_get_current_page(assistant)<3)
   575 		return TRUE;
   576 	    if (!manual_mode)
   577 		gtk_button_clicked(GTK_BUTTON(assistant->close));
   578 	    break;
   579 	case CV_STATE_FINISH:
   580 	    if (assistant && gtk_widget_get_visible(GTK_WIDGET(assistant)))
   581 		return TRUE;
   582 	    gtk_main_quit();
   583 	    baton->eid=0;
   584 	    return FALSE;
   585     }
   586     baton->state++;
   587     return retval;
   588 }
   589 
   590 static void test_check_vendor(void)
   591 {
   592     int fh;
   593     gchar *root,*root_uri,*s;
   594     GFile *file;
   595     GError *err=NULL;
   596     struct razor_importer *importer;
   597     struct razor_set *downgraded;
   598     struct razor_atomic *atomic;
   599     struct plover_vector *packages;
   600     PloverPackageSet *installed;
   601     PloverTransactionHelper *helper;
   602     struct run_update_baton baton={0,};
   603     g_setenv("PLOVER_VENDOR_PREFIX","/srv",TRUE);
   604     root=g_strdup("razor-test-dir-XXXXXX");
   605     g_assert(mkdtemp(root));
   606     file=g_file_new_for_path(root);
   607     root_uri=g_file_get_uri(file);
   608     g_object_unref(file);
   609     g_setenv("RAZOR_ROOT",root_uri,TRUE);
   610     helper=get_transaction_helper();
   611     plover_transaction_helper_set_check_vendor(helper,TRUE);
   612     plover_transaction_helper_set_base(helper,"../yum-repo-test-dir");
   613     installed=plover_package_set_new();
   614     if (!plover_package_set_open(installed,root,TRUE,&err))
   615 	g_error("%s: %s",root,err->message);
   616     importer=razor_importer_create();
   617     razor_importer_begin_package(importer,"zappy","0-1","noarch");
   618     razor_importer_add_details(importer,"","","","");
   619     razor_importer_add_property(importer,"zappy",RAZOR_PROPERTY_PROVIDES,"0-1");
   620     razor_importer_add_install_prefix(importer,"/test");
   621     razor_importer_add_file(importer,"/test/bin/zappy");
   622     razor_importer_finish_package(importer);
   623     downgraded=razor_importer_finish(importer);
   624     atomic=razor_atomic_open("Add downgraded packages");
   625     razor_atomic_make_dirs(atomic,root_uri,"/test/bin/zappy");
   626     s=g_build_filename(root_uri,"test/bin/zappy",NULL);
   627     fh=razor_atomic_create_file(atomic,s,S_IRWXU|S_IRWXG|S_IRWXO);
   628     g_free(s);
   629     razor_atomic_close(atomic,fh);
   630     if (!plover_package_set_update(installed,downgraded,atomic) ||
   631       razor_atomic_commit(atomic))
   632 	g_error("%s: %s",root,razor_atomic_get_error_msg(atomic));
   633     razor_atomic_destroy(atomic);
   634     razor_set_unref(downgraded);
   635     plover_transaction_helper_set_installed(helper,installed);
   636     g_object_unref(installed);
   637     if (!plover_transaction_helper_update(helper,&err))
   638 	g_error("update: %s",err->message);
   639     g_assert(!err);
   640     plover_transaction_helper_present(helper);
   641     baton.helper=helper;
   642     baton.eid=g_idle_add_full(G_PRIORITY_LOW,check_vendor_tick,&baton,NULL);
   643     gtk_main();
   644     g_object_unref(helper);
   645     g_unsetenv("RAZOR_ROOT");
   646     g_free(root);
   647     g_free(root_uri);
   648     g_unsetenv("PLOVER_VENDOR_PREFIX");
   649 }
   650 
   651 struct set_error_baton {
   652     enum {
   653 	SE_STATE_INIT = 0,
   654 	SE_STATE_FINISH
   655     } state;
   656     PloverTransactionHelper *helper;
   657 };
   658 
   659 /*
   660  * This handler may be called as either an event (ie., idle or timeout)
   661  * or as a (swapped) signal. In the latter case, the return is ignored.
   662  */
   663 gboolean set_error_tick(gpointer data)
   664 {
   665     struct set_error_baton *baton=data;
   666     GtkDialog *dlg;
   667     GtkWidget *button;
   668     dlg=GTK_DIALOG(baton->helper->error_dialog);
   669     switch(baton->state)
   670     {
   671 	case SE_STATE_INIT:
   672 	    if (!dlg || !gtk_widget_get_visible(GTK_WIDGET(dlg)))
   673 		return TRUE;
   674 	    button=gtk_dialog_get_widget_for_response(dlg,GTK_RESPONSE_CLOSE);
   675 	    if (!manual_mode)
   676 		gtk_button_clicked(GTK_BUTTON(button));
   677 	    break;
   678 	case SE_STATE_FINISH:
   679 	    if (dlg && gtk_widget_get_visible(GTK_WIDGET(dlg)))
   680 		return TRUE;
   681 	    gtk_main_quit();
   682 	    return FALSE;
   683     }
   684     baton->state++;
   685     return TRUE;
   686 }
   687 
   688 static void test_set_error(void)
   689 {
   690     gchar *root,*root_uri;
   691     const char *errmsg;
   692     GError *err=NULL;
   693     const GError *err2=NULL;
   694     GFile *file;
   695     PloverPackageSet *installed;
   696     PloverTransactionHelper *helper;
   697     struct set_error_baton baton={0,};
   698     root=g_strdup("razor-test-dir-XXXXXX");
   699     g_assert(mkdtemp(root));
   700     file=g_file_new_for_path(root);
   701     g_free(root);
   702     root_uri=g_file_get_uri(file);
   703     g_object_unref(file);
   704     g_setenv("RAZOR_ROOT",root_uri,TRUE);
   705     g_free(root_uri);
   706     helper=get_transaction_helper();
   707     installed=plover_package_set_new_from_installed("../razor-test-dir",&err);
   708     if (!installed)
   709 	g_error("../razor-test-dir: %s",err->message);
   710     plover_transaction_helper_set_installed(helper,installed);
   711     g_object_unref(installed);
   712     plover_transaction_helper_set_base(helper,"../yum-repo-test-dir");
   713     if (!plover_transaction_helper_update(helper,&err))
   714 	plover_transaction_helper_set_error(helper,err,"Expected error");
   715     g_assert(plover_transaction_helper_get_visible(helper));
   716     errmsg=plover_transaction_helper_get_error(helper,&err2);
   717     g_assert_cmpstr(errmsg,==,"Expected error");
   718     g_assert_error(err2,err->domain,err->code);
   719     plover_transaction_helper_present(helper);
   720     baton.helper=helper;
   721     g_idle_add_full(G_PRIORITY_LOW,set_error_tick,&baton,NULL);
   722     g_error_free(err);
   723     gtk_main();
   724     g_object_unref(helper);
   725     g_unsetenv("RAZOR_ROOT");
   726 }
   727 
   728 int main(int argc,char **argv)
   729 {
   730     int retval;
   731     GError *err=NULL;
   732     /*
   733      * Note that because g_test_init() handles --help,
   734      * these options will not appear in the output.
   735      */
   736     GOptionEntry options[]={
   737 	{"manual",0,0,G_OPTION_ARG_NONE,&manual_mode,
   738 	  "Disable automatic mode",NULL},
   739 	{NULL}
   740     };
   741     g_test_init(&argc,&argv,NULL);
   742     g_setenv("GTK_MODULES","",TRUE);
   743     g_setenv("GTK2_RC_FILES","/dev/null",TRUE);
   744     gtk_disable_setlocale();
   745     setlocale(LC_ALL,"C");
   746     g_test_bug_base("mailto:ali@juiblex.co.uk");
   747     if (!gtk_init_with_args(&argc,&argv,NULL,options,NULL,&err))
   748     {
   749 	g_printf("%s\n",err->message);
   750 	exit(0);
   751     }
   752     g_test_add_func("/transactionhelper/init",test_init);
   753     g_test_add_func("/transactionhelper/basic-properties",
   754       test_basic_properties);
   755     g_test_add_func("/transactionhelper/install-group",test_install_group);
   756     g_test_add_func("/transactionhelper/remove-group",test_remove_group);
   757     g_test_add_func("/transactionhelper/update",test_update);
   758     g_test_add_func("/transactionhelper/run-install",test_run_install);
   759     g_test_add_func("/transactionhelper/run-remove",test_run_remove);
   760     g_test_add_func("/transactionhelper/run-update",test_run_update);
   761     g_test_add_func("/transactionhelper/check-vendor",test_check_vendor);
   762     g_test_add_func("/transactionhelper/set-error",test_set_error);
   763     retval=g_test_run();
   764     return retval;
   765 }