2 * Copyright (C) 2016 J. Ali Harlow <ali@juiblex.co.uk>
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.
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.
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.
26 #include <plover/plover.h>
27 #include <plover-gtk/transactionhelper.h>
30 gboolean manual_mode=FALSE;
32 PloverTransactionHelper *get_transaction_helper(void)
37 PloverTransactionHelper *helper;
38 dir=g_getenv("gtk_srcdir");
39 s=g_build_filename(dir,"software-installation.ui",NULL);
41 if (!gtk_builder_add_from_file(ui,s,&err))
42 g_error("%s: %s",s,err->message);
44 helper=plover_transaction_helper_new(ui);
49 static void test_init(void)
51 PloverTransactionHelper *helper;
52 helper=get_transaction_helper();
53 g_object_unref(helper);
56 static void test_basic_properties(void)
61 PloverTransactionHelper *helper;
62 PloverPackageSet *installed;
63 PloverRepository *upstream;
64 upstream=plover_repository_new_from_yum("../yum-repo-test-dir",&err);
66 g_error("../yum-repo-test-dir: %s",err->message);
67 installed=plover_package_set_new_from_installed("../razor-test-dir",&err);
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);
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);
81 g_assert(plover_comps_lookup_group(comps,"base"));
82 prefix=plover_transaction_helper_get_prefix(helper,&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);
92 static void test_install_group(void)
94 gchar *root,*root_uri;
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);
103 root_uri=g_file_get_uri(file);
104 g_object_unref(file);
105 g_setenv("RAZOR_ROOT",root_uri,TRUE);
107 helper=get_transaction_helper();
108 installed=plover_package_set_new_from_installed("../razor-test-dir",&err);
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);
117 g_object_unref(helper);
118 g_unsetenv("RAZOR_ROOT");
121 static void test_remove_group(void)
123 gchar *root,*root_uri;
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);
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,
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);
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);
154 g_object_unref(helper);
155 g_unsetenv("RAZOR_ROOT");
159 static void test_update(void)
161 gchar *root,*root_uri;
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);
170 root_uri=g_file_get_uri(file);
171 g_object_unref(file);
172 g_setenv("RAZOR_ROOT",root_uri,TRUE);
174 helper=get_transaction_helper();
175 installed=plover_package_set_new_from_installed("../razor-test-dir",&err);
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");
188 struct run_install_baton {
193 RI_STATE_PROGRESS_DELAY,
197 guint eid; /* event ID (or 0) */
198 PloverTransactionHelper *helper;
201 gboolean run_install_tick(gpointer data)
203 gboolean retval=TRUE;
204 struct run_install_baton *baton=data;
206 GtkAssistant *assistant=baton->helper->assistant;
210 if (!assistant || !gtk_widget_get_visible(GTK_WIDGET(assistant)))
213 gtk_button_clicked(GTK_BUTTON(assistant->forward));
215 case RI_STATE_SUMMARY:
216 if (gtk_assistant_get_current_page(assistant)<1)
219 gtk_button_clicked(GTK_BUTTON(assistant->apply));
221 case RI_STATE_PROGRESS:
222 if (gtk_assistant_get_current_page(assistant)<2)
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))
231 case RI_STATE_PROGRESS_DELAY:
233 baton->eid=g_idle_add_full(G_PRIORITY_LOW,run_install_tick,baton,
236 gtk_button_clicked(GTK_BUTTON(assistant->forward));
239 if (gtk_assistant_get_current_page(assistant)<3)
242 gtk_button_clicked(GTK_BUTTON(assistant->close));
244 case RI_STATE_FINISH:
245 if (assistant && gtk_widget_get_visible(GTK_WIDGET(assistant)))
255 static void test_run_install(void)
257 gchar *root,*root_uri;
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);
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);
283 plover_vector_free(packages);
284 plover_transaction_helper_present(helper);
286 baton.eid=g_idle_add_full(G_PRIORITY_LOW,run_install_tick,&baton,NULL);
288 g_object_unref(helper);
289 g_unsetenv("RAZOR_ROOT");
293 struct run_remove_baton {
298 RR_STATE_PROGRESS_DELAY,
302 guint eid; /* event ID (or 0) */
303 PloverTransactionHelper *helper;
306 gboolean run_remove_tick(gpointer data)
308 gboolean retval=TRUE;
309 struct run_remove_baton *baton=data;
311 GtkAssistant *assistant=baton->helper->assistant;
315 if (!assistant || !gtk_widget_get_visible(GTK_WIDGET(assistant)))
318 gtk_button_clicked(GTK_BUTTON(assistant->forward));
320 case RR_STATE_SUMMARY:
321 if (gtk_assistant_get_current_page(assistant)<1)
324 gtk_button_clicked(GTK_BUTTON(assistant->apply));
326 case RR_STATE_PROGRESS:
327 if (gtk_assistant_get_current_page(assistant)<2)
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))
336 case RR_STATE_PROGRESS_DELAY:
338 baton->eid=g_idle_add_full(G_PRIORITY_LOW,run_remove_tick,baton,
341 gtk_button_clicked(GTK_BUTTON(assistant->forward));
344 if (gtk_assistant_get_current_page(assistant)<3)
347 gtk_button_clicked(GTK_BUTTON(assistant->close));
349 case RR_STATE_FINISH:
350 if (assistant && gtk_widget_get_visible(GTK_WIDGET(assistant)))
360 static void test_run_remove(void)
362 gchar *root,*root_uri;
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);
376 helper=get_transaction_helper();
377 plover_transaction_helper_set_base(helper,"../yum-repo-test-dir");
379 plover_transaction_helper_group_get_default_packages(helper,"zappy",&err);
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);
393 plover_transaction_helper_present(helper);
395 baton.eid=g_idle_add_full(G_PRIORITY_LOW,run_remove_tick,&baton,NULL);
397 g_object_unref(helper);
398 g_unsetenv("RAZOR_ROOT");
402 struct run_update_baton {
407 RU_STATE_PROGRESS_DELAY,
411 guint eid; /* event ID (or 0) */
412 PloverTransactionHelper *helper;
415 gboolean run_update_tick(gpointer data)
417 gboolean retval=TRUE;
418 struct run_update_baton *baton=data;
420 GtkAssistant *assistant=baton->helper->assistant;
424 if (!assistant || !gtk_widget_get_visible(GTK_WIDGET(assistant)))
427 gtk_button_clicked(GTK_BUTTON(assistant->forward));
429 case RU_STATE_SUMMARY:
430 if (gtk_assistant_get_current_page(assistant)<1)
433 gtk_button_clicked(GTK_BUTTON(assistant->apply));
435 case RU_STATE_PROGRESS:
436 if (gtk_assistant_get_current_page(assistant)<2)
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))
445 case RU_STATE_PROGRESS_DELAY:
447 baton->eid=g_idle_add_full(G_PRIORITY_LOW,run_update_tick,baton,
450 gtk_button_clicked(GTK_BUTTON(assistant->forward));
453 if (gtk_assistant_get_current_page(assistant)<3)
456 gtk_button_clicked(GTK_BUTTON(assistant->close));
458 case RU_STATE_FINISH:
459 if (assistant && gtk_widget_get_visible(GTK_WIDGET(assistant)))
469 static void test_run_update(void)
471 gchar *root,*root_uri;
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);
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);
510 plover_transaction_helper_present(helper);
512 baton.eid=g_idle_add_full(G_PRIORITY_LOW,run_update_tick,&baton,NULL);
514 g_object_unref(helper);
515 g_unsetenv("RAZOR_ROOT");
519 struct check_vendor_baton {
524 CV_STATE_PROGRESS_DELAY,
528 guint eid; /* event ID (or 0) */
529 PloverTransactionHelper *helper;
532 gboolean check_vendor_tick(gpointer data)
534 gboolean retval=TRUE;
535 struct check_vendor_baton *baton=data;
537 GtkAssistant *assistant=baton->helper->assistant;
541 if (!assistant || !gtk_widget_get_visible(GTK_WIDGET(assistant)))
544 gtk_button_clicked(GTK_BUTTON(assistant->forward));
546 case CV_STATE_SUMMARY:
547 if (gtk_assistant_get_current_page(assistant)<1)
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));
554 gtk_button_clicked(GTK_BUTTON(assistant->apply));
556 case CV_STATE_PROGRESS:
557 if (gtk_assistant_get_current_page(assistant)<2)
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))
566 case CV_STATE_PROGRESS_DELAY:
568 baton->eid=g_idle_add_full(G_PRIORITY_LOW,check_vendor_tick,baton,
571 gtk_button_clicked(GTK_BUTTON(assistant->forward));
574 if (gtk_assistant_get_current_page(assistant)<3)
577 gtk_button_clicked(GTK_BUTTON(assistant->close));
579 case CV_STATE_FINISH:
580 if (assistant && gtk_widget_get_visible(GTK_WIDGET(assistant)))
590 static void test_check_vendor(void)
593 gchar *root,*root_uri,*s;
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);
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);
640 plover_transaction_helper_present(helper);
642 baton.eid=g_idle_add_full(G_PRIORITY_LOW,check_vendor_tick,&baton,NULL);
644 g_object_unref(helper);
645 g_unsetenv("RAZOR_ROOT");
648 g_unsetenv("PLOVER_VENDOR_PREFIX");
651 struct set_error_baton {
656 PloverTransactionHelper *helper;
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.
663 gboolean set_error_tick(gpointer data)
665 struct set_error_baton *baton=data;
668 dlg=GTK_DIALOG(baton->helper->error_dialog);
672 if (!dlg || !gtk_widget_get_visible(GTK_WIDGET(dlg)))
674 button=gtk_dialog_get_widget_for_response(dlg,GTK_RESPONSE_CLOSE);
676 gtk_button_clicked(GTK_BUTTON(button));
678 case SE_STATE_FINISH:
679 if (dlg && gtk_widget_get_visible(GTK_WIDGET(dlg)))
688 static void test_set_error(void)
690 gchar *root,*root_uri;
693 const GError *err2=NULL;
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);
702 root_uri=g_file_get_uri(file);
703 g_object_unref(file);
704 g_setenv("RAZOR_ROOT",root_uri,TRUE);
706 helper=get_transaction_helper();
707 installed=plover_package_set_new_from_installed("../razor-test-dir",&err);
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);
721 g_idle_add_full(G_PRIORITY_LOW,set_error_tick,&baton,NULL);
724 g_object_unref(helper);
725 g_unsetenv("RAZOR_ROOT");
728 int main(int argc,char **argv)
733 * Note that because g_test_init() handles --help,
734 * these options will not appear in the output.
736 GOptionEntry options[]={
737 {"manual",0,0,G_OPTION_ARG_NONE,&manual_mode,
738 "Disable automatic mode",NULL},
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))
749 g_printf("%s\n",err->message);
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);