1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/tests/plover-gtk/test-transactionhelper.c Mon Jun 13 12:18:42 2016 +0100
1.3 @@ -0,0 +1,725 @@
1.4 +/*
1.5 + * Copyright (C) 2016 J. Ali Harlow <ali@juiblex.co.uk>
1.6 + *
1.7 + * This program is free software; you can redistribute it and/or modify
1.8 + * it under the terms of the GNU General Public License as published by
1.9 + * the Free Software Foundation; either version 2 of the License, or
1.10 + * (at your option) any later version.
1.11 + *
1.12 + * This program is distributed in the hope that it will be useful,
1.13 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
1.14 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1.15 + * GNU General Public License for more details.
1.16 + *
1.17 + * You should have received a copy of the GNU General Public License along
1.18 + * with this program; if not, write to the Free Software Foundation, Inc.,
1.19 + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
1.20 + */
1.21 +
1.22 +#include <stdlib.h>
1.23 +#include <string.h>
1.24 +#include <locale.h>
1.25 +#include <sys/stat.h>
1.26 +#include <glib.h>
1.27 +#include <gdk/gdk.h>
1.28 +#include <gtk/gtk.h>
1.29 +#include <plover/plover.h>
1.30 +#include <plover-gtk/transactionhelper.h>
1.31 +
1.32 +GtkBuilder *ui;
1.33 +gboolean manual_mode=FALSE;
1.34 +
1.35 +PloverTransactionHelper *get_transaction_helper(void)
1.36 +{
1.37 + const char *dir;
1.38 + gchar *s;
1.39 + GError *err=NULL;
1.40 + PloverTransactionHelper *helper;
1.41 + dir=g_getenv("gtk_srcdir");
1.42 + s=g_build_filename(dir,"software-installation.ui",NULL);
1.43 + ui=gtk_builder_new();
1.44 + if (!gtk_builder_add_from_file(ui,s,&err))
1.45 + g_error("%s: %s",s,err->message);
1.46 + g_free(s);
1.47 + helper=plover_transaction_helper_new(ui);
1.48 + g_object_unref(ui);
1.49 + return helper;
1.50 +}
1.51 +
1.52 +static void test_init(void)
1.53 +{
1.54 + PloverTransactionHelper *helper;
1.55 + helper=get_transaction_helper();
1.56 + g_object_unref(helper);
1.57 +}
1.58 +
1.59 +static void test_basic_properties(void)
1.60 +{
1.61 + const char *prefix;
1.62 + GError *err=NULL;
1.63 + struct comps *comps;
1.64 + PloverTransactionHelper *helper;
1.65 + PloverPackageSet *installed;
1.66 + PloverRepository *upstream;
1.67 + upstream=plover_repository_new_from_yum("../yum-repo-test-dir",&err);
1.68 + if (!upstream)
1.69 + g_error("../yum-repo-test-dir: %s",err->message);
1.70 + installed=plover_package_set_new_from_installed("../razor-test-dir",&err);
1.71 + if (!installed)
1.72 + g_error("../razor-test-dir: %s",err->message);
1.73 + helper=get_transaction_helper();
1.74 + g_assert(!plover_transaction_helper_get_visible(helper));
1.75 + plover_transaction_helper_set_installed(helper,installed);
1.76 + g_assert(plover_transaction_helper_get_installed(helper)==installed);
1.77 + plover_transaction_helper_set_upstream(helper,upstream);
1.78 + g_assert(plover_transaction_helper_get_upstream(helper,&err)==upstream);
1.79 + g_assert(!err);
1.80 + plover_transaction_helper_set_base(helper,"../yum-repo-test-dir");
1.81 + g_assert_cmpstr(plover_transaction_helper_get_base(helper),==,"../yum-repo-test-dir");
1.82 + comps=plover_transaction_helper_get_comps(helper,&err);
1.83 + g_assert(!err);
1.84 + g_assert(plover_comps_lookup_group(comps,"base"));
1.85 + prefix=plover_transaction_helper_get_prefix(helper,&err);
1.86 + g_assert(!err);
1.87 + g_assert_cmpstr(prefix,==,plover_default_prefix_for_vendor("Acme Corporation"));
1.88 + g_assert(!plover_transaction_helper_get_visible(helper));
1.89 + g_assert(!plover_transaction_helper_get_error(helper,NULL));
1.90 + g_object_unref(upstream);
1.91 + g_object_unref(installed);
1.92 + g_object_unref(helper);
1.93 +}
1.94 +
1.95 +static void test_install_group(void)
1.96 +{
1.97 + gchar *root;
1.98 + GError *err=NULL;
1.99 + PloverPackageSet *installed;
1.100 + PloverTransactionHelper *helper;
1.101 + root=g_strdup("razor-test-dir-XXXXXX");
1.102 + g_assert(mkdtemp(root));
1.103 + g_setenv("RAZOR_ROOT",root,TRUE);
1.104 + g_free(root);
1.105 + helper=get_transaction_helper();
1.106 + installed=plover_package_set_new_from_installed("../razor-test-dir",&err);
1.107 + if (!installed)
1.108 + g_error("../razor-test-dir: %s",err->message);
1.109 + plover_transaction_helper_set_installed(helper,installed);
1.110 + g_object_unref(installed);
1.111 + plover_transaction_helper_set_base(helper,"../yum-repo-test-dir");
1.112 + if (!plover_transaction_helper_install_group(helper,"base",&err))
1.113 + g_error("base: %s",err->message);
1.114 + g_assert(!err);
1.115 + g_object_unref(helper);
1.116 + g_unsetenv("RAZOR_ROOT");
1.117 +}
1.118 +
1.119 +static void test_remove_group(void)
1.120 +{
1.121 + gchar *root;
1.122 + GError *err=NULL;
1.123 + PloverPackageSet *installed;
1.124 + PloverTransactionHelper *helper;
1.125 + struct plover_vector *packages;
1.126 + char *pkgs[]={"zip",NULL};
1.127 + root=g_strdup("razor-test-dir-XXXXXX");
1.128 + g_assert(mkdtemp(root));
1.129 + g_setenv("RAZOR_ROOT",root,TRUE);
1.130 + helper=get_transaction_helper();
1.131 + plover_transaction_helper_set_base(helper,"../yum-repo-test-dir");
1.132 + packages=plover_transaction_helper_group_get_default_packages(helper,
1.133 + "zappy",&err);
1.134 + if (!packages)
1.135 + g_error("zappy: %s",err->message);
1.136 + if (!plover_install("../yum-repo-test-dir",NULL,packages->strings,&err))
1.137 + g_error("plover_install: %s",err->message);
1.138 + plover_vector_free(packages);
1.139 + installed=plover_package_set_new_from_installed(root,&err);
1.140 + if (!installed)
1.141 + g_error("%s: %s",root,err->message);
1.142 + plover_transaction_helper_set_installed(helper,installed);
1.143 + g_object_unref(installed);
1.144 + if (!plover_transaction_helper_remove_group(helper,"zappy",&err))
1.145 + g_error("zappy: %s",err->message);
1.146 + g_assert(!err);
1.147 + g_object_unref(helper);
1.148 + g_unsetenv("RAZOR_ROOT");
1.149 + g_free(root);
1.150 +}
1.151 +
1.152 +static void test_update(void)
1.153 +{
1.154 + gchar *root;
1.155 + GError *err=NULL;
1.156 + PloverPackageSet *installed;
1.157 + PloverTransactionHelper *helper;
1.158 + root=g_strdup("razor-test-dir-XXXXXX");
1.159 + g_assert(mkdtemp(root));
1.160 + g_setenv("RAZOR_ROOT",root,TRUE);
1.161 + g_free(root);
1.162 + helper=get_transaction_helper();
1.163 + installed=plover_package_set_new_from_installed("../razor-test-dir",&err);
1.164 + if (!installed)
1.165 + g_error("../razor-test-dir: %s",err->message);
1.166 + plover_transaction_helper_set_installed(helper,installed);
1.167 + g_object_unref(installed);
1.168 + plover_transaction_helper_set_base(helper,"../yum-repo-test-dir");
1.169 + if (plover_transaction_helper_update(helper,&err))
1.170 + g_error("plover_transaction_helper_update reports work to be done");
1.171 + g_assert_error(err,PLOVER_GENERAL_ERROR,PLOVER_GENERAL_ERROR_NO_WORK);
1.172 + g_object_unref(helper);
1.173 + g_unsetenv("RAZOR_ROOT");
1.174 +}
1.175 +
1.176 +struct run_install_baton {
1.177 + enum {
1.178 + RI_STATE_INIT = 0,
1.179 + RI_STATE_SUMMARY,
1.180 + RI_STATE_PROGRESS,
1.181 + RI_STATE_PROGRESS_DELAY,
1.182 + RI_STATE_DONE,
1.183 + RI_STATE_FINISH
1.184 + } state;
1.185 + guint eid; /* event ID (or 0) */
1.186 + PloverTransactionHelper *helper;
1.187 +};
1.188 +
1.189 +gboolean run_install_tick(gpointer data)
1.190 +{
1.191 + gboolean retval=TRUE;
1.192 + struct run_install_baton *baton=data;
1.193 + GtkWidget *page;
1.194 + GtkAssistant *assistant=baton->helper->assistant;
1.195 + switch(baton->state)
1.196 + {
1.197 + case RI_STATE_INIT:
1.198 + if (!assistant || !gtk_widget_get_visible(GTK_WIDGET(assistant)))
1.199 + return TRUE;
1.200 + if (!manual_mode)
1.201 + gtk_button_clicked(GTK_BUTTON(assistant->forward));
1.202 + break;
1.203 + case RI_STATE_SUMMARY:
1.204 + if (gtk_assistant_get_current_page(assistant)<1)
1.205 + return TRUE;
1.206 + if (!manual_mode)
1.207 + gtk_button_clicked(GTK_BUTTON(assistant->apply));
1.208 + break;
1.209 + case RI_STATE_PROGRESS:
1.210 + if (gtk_assistant_get_current_page(assistant)<2)
1.211 + return TRUE;
1.212 + page=gtk_assistant_get_nth_page(assistant,2);
1.213 + baton->eid=g_timeout_add_seconds(1,run_install_tick,baton);
1.214 + if (!gtk_assistant_get_page_complete(assistant,page))
1.215 + return FALSE;
1.216 + else
1.217 + retval=FALSE;
1.218 + break;
1.219 + case RI_STATE_PROGRESS_DELAY:
1.220 + retval=FALSE;
1.221 + baton->eid=g_idle_add_full(G_PRIORITY_LOW,run_install_tick,baton,
1.222 + NULL);
1.223 + if (!manual_mode)
1.224 + gtk_button_clicked(GTK_BUTTON(assistant->forward));
1.225 + break;
1.226 + case RI_STATE_DONE:
1.227 + if (gtk_assistant_get_current_page(assistant)<3)
1.228 + return TRUE;
1.229 + if (!manual_mode)
1.230 + gtk_button_clicked(GTK_BUTTON(assistant->close));
1.231 + break;
1.232 + case RI_STATE_FINISH:
1.233 + if (assistant && gtk_widget_get_visible(GTK_WIDGET(assistant)))
1.234 + return TRUE;
1.235 + gtk_main_quit();
1.236 + baton->eid=0;
1.237 + return FALSE;
1.238 + }
1.239 + baton->state++;
1.240 + return retval;
1.241 +}
1.242 +
1.243 +static void test_run_install(void)
1.244 +{
1.245 + gchar *root;
1.246 + GError *err=NULL;
1.247 + struct plover_vector *packages;
1.248 + PloverPackageSet *installed;
1.249 + PloverTransactionHelper *helper;
1.250 + struct run_install_baton baton={0,};
1.251 + root=g_strdup("razor-test-dir-XXXXXX");
1.252 + g_assert(mkdtemp(root));
1.253 + g_setenv("RAZOR_ROOT",root,TRUE);
1.254 + helper=get_transaction_helper();
1.255 + installed=plover_package_set_new();
1.256 + if (!plover_package_set_open(installed,root,TRUE,&err))
1.257 + g_error("%s: %s",root,err->message);
1.258 + plover_transaction_helper_set_installed(helper,installed);
1.259 + g_object_unref(installed);
1.260 + plover_transaction_helper_set_base(helper,"../yum-repo-test-dir");
1.261 + packages=plover_vector_new();
1.262 + plover_vector_append(packages,"zappy-tools");
1.263 + if (!plover_transaction_helper_install_packages(helper,packages,&err))
1.264 + g_error("zappy-tools: %s",err->message);
1.265 + g_assert(!err);
1.266 + plover_vector_free(packages);
1.267 + plover_transaction_helper_present(helper);
1.268 + baton.helper=helper;
1.269 + baton.eid=g_idle_add_full(G_PRIORITY_LOW,run_install_tick,&baton,NULL);
1.270 + gtk_main();
1.271 + g_object_unref(helper);
1.272 + g_unsetenv("RAZOR_ROOT");
1.273 + g_free(root);
1.274 +}
1.275 +
1.276 +struct run_remove_baton {
1.277 + enum {
1.278 + RR_STATE_INIT = 0,
1.279 + RR_STATE_SUMMARY,
1.280 + RR_STATE_PROGRESS,
1.281 + RR_STATE_PROGRESS_DELAY,
1.282 + RR_STATE_DONE,
1.283 + RR_STATE_FINISH
1.284 + } state;
1.285 + guint eid; /* event ID (or 0) */
1.286 + PloverTransactionHelper *helper;
1.287 +};
1.288 +
1.289 +gboolean run_remove_tick(gpointer data)
1.290 +{
1.291 + gboolean retval=TRUE;
1.292 + struct run_remove_baton *baton=data;
1.293 + GtkWidget *page;
1.294 + GtkAssistant *assistant=baton->helper->assistant;
1.295 + switch(baton->state)
1.296 + {
1.297 + case RR_STATE_INIT:
1.298 + if (!assistant || !gtk_widget_get_visible(GTK_WIDGET(assistant)))
1.299 + return TRUE;
1.300 + if (!manual_mode)
1.301 + gtk_button_clicked(GTK_BUTTON(assistant->forward));
1.302 + break;
1.303 + case RR_STATE_SUMMARY:
1.304 + if (gtk_assistant_get_current_page(assistant)<1)
1.305 + return TRUE;
1.306 + if (!manual_mode)
1.307 + gtk_button_clicked(GTK_BUTTON(assistant->apply));
1.308 + break;
1.309 + case RR_STATE_PROGRESS:
1.310 + if (gtk_assistant_get_current_page(assistant)<2)
1.311 + return TRUE;
1.312 + page=gtk_assistant_get_nth_page(assistant,2);
1.313 + baton->eid=g_timeout_add_seconds(1,run_remove_tick,baton);
1.314 + if (!gtk_assistant_get_page_complete(assistant,page))
1.315 + return FALSE;
1.316 + else
1.317 + retval=FALSE;
1.318 + break;
1.319 + case RR_STATE_PROGRESS_DELAY:
1.320 + retval=FALSE;
1.321 + baton->eid=g_idle_add_full(G_PRIORITY_LOW,run_remove_tick,baton,
1.322 + NULL);
1.323 + if (!manual_mode)
1.324 + gtk_button_clicked(GTK_BUTTON(assistant->forward));
1.325 + break;
1.326 + case RR_STATE_DONE:
1.327 + if (gtk_assistant_get_current_page(assistant)<3)
1.328 + return TRUE;
1.329 + if (!manual_mode)
1.330 + gtk_button_clicked(GTK_BUTTON(assistant->close));
1.331 + break;
1.332 + case RR_STATE_FINISH:
1.333 + if (assistant && gtk_widget_get_visible(GTK_WIDGET(assistant)))
1.334 + return TRUE;
1.335 + gtk_main_quit();
1.336 + baton->eid=0;
1.337 + return FALSE;
1.338 + }
1.339 + baton->state++;
1.340 + return retval;
1.341 +}
1.342 +
1.343 +static void test_run_remove(void)
1.344 +{
1.345 + gchar *root;
1.346 + GError *err=NULL;
1.347 + struct plover_vector *packages;
1.348 + PloverPackageSet *installed;
1.349 + PloverTransactionHelper *helper;
1.350 + struct run_remove_baton baton={0,};
1.351 + root=g_strdup("razor-test-dir-XXXXXX");
1.352 + g_assert(mkdtemp(root));
1.353 + g_setenv("RAZOR_ROOT",root,TRUE);
1.354 + helper=get_transaction_helper();
1.355 + plover_transaction_helper_set_base(helper,"../yum-repo-test-dir");
1.356 + packages=
1.357 + plover_transaction_helper_group_get_default_packages(helper,"zappy",&err);
1.358 + if (!packages)
1.359 + g_error("zappy: %s",err->message);
1.360 + if (!plover_install("../yum-repo-test-dir",NULL,packages->strings,&err))
1.361 + g_error("plover_install: %s",err->message);
1.362 + plover_vector_free(packages);
1.363 + installed=plover_package_set_new();
1.364 + if (!plover_package_set_open(installed,root,TRUE,&err))
1.365 + g_error("%s: %s",root,err->message);
1.366 + plover_transaction_helper_set_installed(helper,installed);
1.367 + g_object_unref(installed);
1.368 + if (!plover_transaction_helper_remove_group(helper,"zappy",&err))
1.369 + g_error("zappy: %s",err->message);
1.370 + g_assert(!err);
1.371 + plover_transaction_helper_present(helper);
1.372 + baton.helper=helper;
1.373 + baton.eid=g_idle_add_full(G_PRIORITY_LOW,run_remove_tick,&baton,NULL);
1.374 + gtk_main();
1.375 + g_object_unref(helper);
1.376 + g_unsetenv("RAZOR_ROOT");
1.377 + g_free(root);
1.378 +}
1.379 +
1.380 +struct run_update_baton {
1.381 + enum {
1.382 + RU_STATE_INIT = 0,
1.383 + RU_STATE_SUMMARY,
1.384 + RU_STATE_PROGRESS,
1.385 + RU_STATE_PROGRESS_DELAY,
1.386 + RU_STATE_DONE,
1.387 + RU_STATE_FINISH
1.388 + } state;
1.389 + guint eid; /* event ID (or 0) */
1.390 + PloverTransactionHelper *helper;
1.391 +};
1.392 +
1.393 +gboolean run_update_tick(gpointer data)
1.394 +{
1.395 + gboolean retval=TRUE;
1.396 + struct run_update_baton *baton=data;
1.397 + GtkWidget *page;
1.398 + GtkAssistant *assistant=baton->helper->assistant;
1.399 + switch(baton->state)
1.400 + {
1.401 + case RU_STATE_INIT:
1.402 + if (!assistant || !gtk_widget_get_visible(GTK_WIDGET(assistant)))
1.403 + return TRUE;
1.404 + if (!manual_mode)
1.405 + gtk_button_clicked(GTK_BUTTON(assistant->forward));
1.406 + break;
1.407 + case RU_STATE_SUMMARY:
1.408 + if (gtk_assistant_get_current_page(assistant)<1)
1.409 + return TRUE;
1.410 + if (!manual_mode)
1.411 + gtk_button_clicked(GTK_BUTTON(assistant->apply));
1.412 + break;
1.413 + case RU_STATE_PROGRESS:
1.414 + if (gtk_assistant_get_current_page(assistant)<2)
1.415 + return TRUE;
1.416 + page=gtk_assistant_get_nth_page(assistant,2);
1.417 + baton->eid=g_timeout_add_seconds(1,run_update_tick,baton);
1.418 + if (!gtk_assistant_get_page_complete(assistant,page))
1.419 + return FALSE;
1.420 + else
1.421 + retval=FALSE;
1.422 + break;
1.423 + case RU_STATE_PROGRESS_DELAY:
1.424 + retval=FALSE;
1.425 + baton->eid=g_idle_add_full(G_PRIORITY_LOW,run_update_tick,baton,
1.426 + NULL);
1.427 + if (!manual_mode)
1.428 + gtk_button_clicked(GTK_BUTTON(assistant->forward));
1.429 + break;
1.430 + case RU_STATE_DONE:
1.431 + if (gtk_assistant_get_current_page(assistant)<3)
1.432 + return TRUE;
1.433 + if (!manual_mode)
1.434 + gtk_button_clicked(GTK_BUTTON(assistant->close));
1.435 + break;
1.436 + case RU_STATE_FINISH:
1.437 + if (assistant && gtk_widget_get_visible(GTK_WIDGET(assistant)))
1.438 + return TRUE;
1.439 + gtk_main_quit();
1.440 + baton->eid=0;
1.441 + return FALSE;
1.442 + }
1.443 + baton->state++;
1.444 + return retval;
1.445 +}
1.446 +
1.447 +static void test_run_update(void)
1.448 +{
1.449 + gchar *root;
1.450 + GError *err=NULL;
1.451 + struct razor_importer *importer;
1.452 + struct razor_set *downgraded;
1.453 + struct razor_atomic *atomic;
1.454 + struct plover_vector *packages;
1.455 + PloverPackageSet *installed;
1.456 + PloverTransactionHelper *helper;
1.457 + struct run_update_baton baton={0,};
1.458 + root=g_strdup("razor-test-dir-XXXXXX");
1.459 + g_assert(mkdtemp(root));
1.460 + g_setenv("RAZOR_ROOT",root,TRUE);
1.461 + helper=get_transaction_helper();
1.462 + plover_transaction_helper_set_base(helper,"../yum-repo-test-dir");
1.463 + installed=plover_package_set_new();
1.464 + if (!plover_package_set_open(installed,root,TRUE,&err))
1.465 + g_error("%s: %s",root,err->message);
1.466 + importer=razor_importer_create();
1.467 + razor_importer_begin_package(importer,"zappy","0-1","noarch");
1.468 + razor_importer_add_details(importer,"","","","");
1.469 + razor_importer_add_property(importer,"zappy",RAZOR_PROPERTY_PROVIDES,"0-1");
1.470 + razor_importer_finish_package(importer);
1.471 + downgraded=razor_importer_finish(importer);
1.472 + atomic=razor_atomic_open("Add downgraded packages");
1.473 + if (!plover_package_set_update(installed,downgraded,atomic) ||
1.474 + razor_atomic_commit(atomic))
1.475 + g_error("%s: %s",root,razor_atomic_get_error_msg(atomic));
1.476 + razor_atomic_destroy(atomic);
1.477 + razor_set_unref(downgraded);
1.478 + plover_transaction_helper_set_installed(helper,installed);
1.479 + g_object_unref(installed);
1.480 + if (!plover_transaction_helper_update(helper,&err))
1.481 + g_error("update: %s",err->message);
1.482 + g_assert(!err);
1.483 + plover_transaction_helper_present(helper);
1.484 + baton.helper=helper;
1.485 + baton.eid=g_idle_add_full(G_PRIORITY_LOW,run_update_tick,&baton,NULL);
1.486 + gtk_main();
1.487 + g_object_unref(helper);
1.488 + g_unsetenv("RAZOR_ROOT");
1.489 + g_free(root);
1.490 +}
1.491 +
1.492 +struct check_vendor_baton {
1.493 + enum {
1.494 + CV_STATE_INIT = 0,
1.495 + CV_STATE_SUMMARY,
1.496 + CV_STATE_PROGRESS,
1.497 + CV_STATE_PROGRESS_DELAY,
1.498 + CV_STATE_DONE,
1.499 + CV_STATE_FINISH
1.500 + } state;
1.501 + guint eid; /* event ID (or 0) */
1.502 + PloverTransactionHelper *helper;
1.503 +};
1.504 +
1.505 +gboolean check_vendor_tick(gpointer data)
1.506 +{
1.507 + gboolean retval=TRUE;
1.508 + struct check_vendor_baton *baton=data;
1.509 + GtkWidget *page,*w;
1.510 + GtkAssistant *assistant=baton->helper->assistant;
1.511 + switch(baton->state)
1.512 + {
1.513 + case CV_STATE_INIT:
1.514 + if (!assistant || !gtk_widget_get_visible(GTK_WIDGET(assistant)))
1.515 + return TRUE;
1.516 + if (!manual_mode)
1.517 + gtk_button_clicked(GTK_BUTTON(assistant->forward));
1.518 + break;
1.519 + case CV_STATE_SUMMARY:
1.520 + if (gtk_assistant_get_current_page(assistant)<1)
1.521 + return TRUE;
1.522 + g_assert(!gtk_widget_is_sensitive(assistant->apply));
1.523 + w=GTK_WIDGET(gtk_builder_get_object(ui,"SIRemoveExisting"));
1.524 + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w),TRUE);
1.525 + g_assert(gtk_widget_is_sensitive(assistant->apply));
1.526 + if (!manual_mode)
1.527 + gtk_button_clicked(GTK_BUTTON(assistant->apply));
1.528 + break;
1.529 + case CV_STATE_PROGRESS:
1.530 + if (gtk_assistant_get_current_page(assistant)<2)
1.531 + return TRUE;
1.532 + page=gtk_assistant_get_nth_page(assistant,2);
1.533 + baton->eid=g_timeout_add_seconds(1,check_vendor_tick,baton);
1.534 + if (!gtk_assistant_get_page_complete(assistant,page))
1.535 + return FALSE;
1.536 + else
1.537 + retval=FALSE;
1.538 + break;
1.539 + case CV_STATE_PROGRESS_DELAY:
1.540 + retval=FALSE;
1.541 + baton->eid=g_idle_add_full(G_PRIORITY_LOW,check_vendor_tick,baton,
1.542 + NULL);
1.543 + if (!manual_mode)
1.544 + gtk_button_clicked(GTK_BUTTON(assistant->forward));
1.545 + break;
1.546 + case CV_STATE_DONE:
1.547 + if (gtk_assistant_get_current_page(assistant)<3)
1.548 + return TRUE;
1.549 + if (!manual_mode)
1.550 + gtk_button_clicked(GTK_BUTTON(assistant->close));
1.551 + break;
1.552 + case CV_STATE_FINISH:
1.553 + if (assistant && gtk_widget_get_visible(GTK_WIDGET(assistant)))
1.554 + return TRUE;
1.555 + gtk_main_quit();
1.556 + baton->eid=0;
1.557 + return FALSE;
1.558 + }
1.559 + baton->state++;
1.560 + return retval;
1.561 +}
1.562 +
1.563 +static void test_check_vendor(void)
1.564 +{
1.565 + int fh;
1.566 + gchar *root,*s;
1.567 + GError *err=NULL;
1.568 + struct razor_importer *importer;
1.569 + struct razor_set *downgraded;
1.570 + struct razor_atomic *atomic;
1.571 + struct plover_vector *packages;
1.572 + PloverPackageSet *installed;
1.573 + PloverTransactionHelper *helper;
1.574 + struct run_update_baton baton={0,};
1.575 + g_setenv("PLOVER_VENDOR_PREFIX","/srv",TRUE);
1.576 + root=g_strdup("razor-test-dir-XXXXXX");
1.577 + g_assert(mkdtemp(root));
1.578 + g_setenv("RAZOR_ROOT",root,TRUE);
1.579 + helper=get_transaction_helper();
1.580 + plover_transaction_helper_set_check_vendor(helper,TRUE);
1.581 + plover_transaction_helper_set_base(helper,"../yum-repo-test-dir");
1.582 + installed=plover_package_set_new();
1.583 + if (!plover_package_set_open(installed,root,TRUE,&err))
1.584 + g_error("%s: %s",root,err->message);
1.585 + importer=razor_importer_create();
1.586 + razor_importer_begin_package(importer,"zappy","0-1","noarch");
1.587 + razor_importer_add_details(importer,"","","","");
1.588 + razor_importer_add_property(importer,"zappy",RAZOR_PROPERTY_PROVIDES,"0-1");
1.589 + razor_importer_add_install_prefix(importer,"/test");
1.590 + razor_importer_add_file(importer,"/test/bin/zappy");
1.591 + razor_importer_finish_package(importer);
1.592 + downgraded=razor_importer_finish(importer);
1.593 + atomic=razor_atomic_open("Add downgraded packages");
1.594 + razor_atomic_make_dirs(atomic,root,"/test/bin/zappy");
1.595 + s=g_build_filename(root,"test/bin/zappy",NULL);
1.596 + fh=razor_atomic_create_file(atomic,s,S_IRWXU|S_IRWXG|S_IRWXO);
1.597 + g_free(s);
1.598 + razor_atomic_close(atomic,fh);
1.599 + if (!plover_package_set_update(installed,downgraded,atomic) ||
1.600 + razor_atomic_commit(atomic))
1.601 + g_error("%s: %s",root,razor_atomic_get_error_msg(atomic));
1.602 + razor_atomic_destroy(atomic);
1.603 + razor_set_unref(downgraded);
1.604 + plover_transaction_helper_set_installed(helper,installed);
1.605 + g_object_unref(installed);
1.606 + if (!plover_transaction_helper_update(helper,&err))
1.607 + g_error("update: %s",err->message);
1.608 + g_assert(!err);
1.609 + plover_transaction_helper_present(helper);
1.610 + baton.helper=helper;
1.611 + baton.eid=g_idle_add_full(G_PRIORITY_LOW,check_vendor_tick,&baton,NULL);
1.612 + gtk_main();
1.613 + g_object_unref(helper);
1.614 + g_unsetenv("RAZOR_ROOT");
1.615 + g_free(root);
1.616 + g_unsetenv("PLOVER_VENDOR_PREFIX");
1.617 +}
1.618 +
1.619 +struct set_error_baton {
1.620 + enum {
1.621 + SE_STATE_INIT = 0,
1.622 + SE_STATE_FINISH
1.623 + } state;
1.624 + PloverTransactionHelper *helper;
1.625 +};
1.626 +
1.627 +/*
1.628 + * This handler may be called as either an event (ie., idle or timeout)
1.629 + * or as a (swapped) signal. In the latter case, the return is ignored.
1.630 + */
1.631 +gboolean set_error_tick(gpointer data)
1.632 +{
1.633 + struct set_error_baton *baton=data;
1.634 + GtkDialog *dlg;
1.635 + GtkWidget *button;
1.636 + dlg=GTK_DIALOG(baton->helper->error_dialog);
1.637 + switch(baton->state)
1.638 + {
1.639 + case SE_STATE_INIT:
1.640 + if (!dlg || !gtk_widget_get_visible(GTK_WIDGET(dlg)))
1.641 + return TRUE;
1.642 + button=gtk_dialog_get_widget_for_response(dlg,GTK_RESPONSE_CLOSE);
1.643 + if (!manual_mode)
1.644 + gtk_button_clicked(GTK_BUTTON(button));
1.645 + break;
1.646 + case SE_STATE_FINISH:
1.647 + if (dlg && gtk_widget_get_visible(GTK_WIDGET(dlg)))
1.648 + return TRUE;
1.649 + gtk_main_quit();
1.650 + return FALSE;
1.651 + }
1.652 + baton->state++;
1.653 + return TRUE;
1.654 +}
1.655 +
1.656 +static void test_set_error(void)
1.657 +{
1.658 + gchar *root;
1.659 + const char *errmsg;
1.660 + GError *err=NULL;
1.661 + const GError *err2=NULL;
1.662 + PloverPackageSet *installed;
1.663 + PloverTransactionHelper *helper;
1.664 + struct set_error_baton baton={0,};
1.665 + root=g_strdup("razor-test-dir-XXXXXX");
1.666 + g_assert(mkdtemp(root));
1.667 + g_setenv("RAZOR_ROOT",root,TRUE);
1.668 + g_free(root);
1.669 + helper=get_transaction_helper();
1.670 + installed=plover_package_set_new_from_installed("../razor-test-dir",&err);
1.671 + if (!installed)
1.672 + g_error("../razor-test-dir: %s",err->message);
1.673 + plover_transaction_helper_set_installed(helper,installed);
1.674 + g_object_unref(installed);
1.675 + plover_transaction_helper_set_base(helper,"../yum-repo-test-dir");
1.676 + if (!plover_transaction_helper_update(helper,&err))
1.677 + plover_transaction_helper_set_error(helper,err,"Expected error");
1.678 + g_assert(plover_transaction_helper_get_visible(helper));
1.679 + errmsg=plover_transaction_helper_get_error(helper,&err2);
1.680 + g_assert_cmpstr(errmsg,==,"Expected error");
1.681 + g_assert_error(err2,err->domain,err->code);
1.682 + plover_transaction_helper_present(helper);
1.683 + baton.helper=helper;
1.684 + g_idle_add_full(G_PRIORITY_LOW,set_error_tick,&baton,NULL);
1.685 + g_error_free(err);
1.686 + gtk_main();
1.687 + g_object_unref(helper);
1.688 + g_unsetenv("RAZOR_ROOT");
1.689 +}
1.690 +
1.691 +int main(int argc,char **argv)
1.692 +{
1.693 + int retval;
1.694 + GError *err=NULL;
1.695 + /*
1.696 + * Note that because g_test_init() handles --help,
1.697 + * these options will not appear in the output.
1.698 + */
1.699 + GOptionEntry options[]={
1.700 + {"manual",0,0,G_OPTION_ARG_NONE,&manual_mode,
1.701 + "Disable automatic mode",NULL},
1.702 + {NULL}
1.703 + };
1.704 + g_test_init(&argc,&argv,NULL);
1.705 + g_setenv("GTK_MODULES","",TRUE);
1.706 + g_setenv("GTK2_RC_FILES","/dev/null",TRUE);
1.707 + gtk_disable_setlocale();
1.708 + setlocale(LC_ALL,"C");
1.709 + g_test_bug_base("mailto:ali@juiblex.co.uk");
1.710 + if (!gtk_init_with_args(&argc,&argv,NULL,options,NULL,&err))
1.711 + {
1.712 + g_printf("%s\n",err->message);
1.713 + exit(0);
1.714 + }
1.715 + g_test_add_func("/transactionhelper/init",test_init);
1.716 + g_test_add_func("/transactionhelper/basic-properties",
1.717 + test_basic_properties);
1.718 + g_test_add_func("/transactionhelper/install-group",test_install_group);
1.719 + g_test_add_func("/transactionhelper/remove-group",test_remove_group);
1.720 + g_test_add_func("/transactionhelper/update",test_update);
1.721 + g_test_add_func("/transactionhelper/run-install",test_run_install);
1.722 + g_test_add_func("/transactionhelper/run-remove",test_run_remove);
1.723 + g_test_add_func("/transactionhelper/run-update",test_run_update);
1.724 + g_test_add_func("/transactionhelper/check-vendor",test_check_vendor);
1.725 + g_test_add_func("/transactionhelper/set-error",test_set_error);
1.726 + retval=g_test_run();
1.727 + return retval;
1.728 +}