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.
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;
33 static void complete_changed(GtkWidget *page,GParamSpec *child_property,
34 PloverTransactionHelper *helper)
36 g_message("complete child property for %s now %s",
37 gtk_buildable_get_name(GTK_BUILDABLE(page)),
38 gtk_assistant_get_page_complete(helper->assistant,page)?"TRUE":"FALSE");
42 PloverTransactionHelper *get_transaction_helper(void)
47 PloverTransactionHelper *helper;
48 dir=g_getenv("gtk_srcdir");
49 s=g_build_filename(dir,"software-installation.ui",NULL);
51 if (!gtk_builder_add_from_file(ui,s,&err))
52 g_error("%s: %s",s,err->message);
54 helper=plover_transaction_helper_new(ui);
57 if (helper->assistant)
61 for(i=gtk_assistant_get_n_pages(helper->assistant)-1;i>=0;i--)
63 page=gtk_assistant_get_nth_page(helper->assistant,i);
64 g_signal_connect(page,"child-notify::complete",
65 G_CALLBACK(complete_changed),helper);
66 g_message("complete child property for %s initially %s",
67 gtk_buildable_get_name(GTK_BUILDABLE(page)),
68 gtk_assistant_get_page_complete(helper->assistant,page)?
76 static void test_init(void)
78 PloverTransactionHelper *helper;
79 helper=get_transaction_helper();
80 g_object_unref(helper);
83 static void test_basic_properties(void)
87 gchar *default_prefix;
90 PloverTransactionHelper *helper;
91 PloverPackageSet *installed;
92 PloverRepository *upstream;
93 upstream=plover_repository_new_from_yum("../yum-repo-test-dir",&err);
95 g_error("../yum-repo-test-dir: %s",err->message);
96 uri=razor_path_to_uri("../razor-test-dir");
97 installed=plover_package_set_new_from_installed(uri,&err);
100 g_error("../razor-test-dir: %s",err->message);
101 helper=get_transaction_helper();
102 g_assert(!plover_transaction_helper_get_visible(helper));
103 plover_transaction_helper_set_installed(helper,installed);
104 g_assert(plover_transaction_helper_get_installed(helper)==installed);
105 plover_transaction_helper_set_upstream(helper,upstream);
106 g_assert(plover_transaction_helper_get_upstream(helper,&err)==upstream);
108 plover_transaction_helper_set_base(helper,"../yum-repo-test-dir");
109 g_assert_cmpstr(plover_transaction_helper_get_base(helper),==,"../yum-repo-test-dir");
110 comps=plover_transaction_helper_get_comps(helper,&err);
112 g_assert(plover_comps_lookup_group(comps,"base"));
113 prefix=plover_transaction_helper_get_prefix(helper,&err);
115 comps=plover_comps_new();
116 plover_comps_set_vendor(comps,"Acme Corporation");
117 default_prefix=plover_comps_get_default_prefix(comps);
118 plover_comps_free(comps);
119 g_assert_cmpstr(prefix,==,default_prefix);
120 g_free(default_prefix);
121 g_assert(!plover_transaction_helper_get_visible(helper));
122 g_assert(!plover_transaction_helper_get_error(helper,NULL));
123 g_object_unref(upstream);
124 g_object_unref(installed);
125 g_object_unref(helper);
128 static void test_install_group(void)
133 PloverPackageSet *installed;
134 PloverTransactionHelper *helper;
135 root=g_strdup("razor-test-dir-XXXXXX");
136 g_assert(mkdtemp(root));
137 uri=razor_path_to_uri(root);
139 g_setenv("RAZOR_ROOT",uri,TRUE);
141 helper=get_transaction_helper();
142 uri=razor_path_to_uri("../razor-test-dir");
143 installed=plover_package_set_new_from_installed(uri,&err);
146 g_error("../razor-test-dir: %s",err->message);
147 plover_transaction_helper_set_installed(helper,installed);
148 g_object_unref(installed);
149 plover_transaction_helper_set_base(helper,"../yum-repo-test-dir");
150 if (!plover_transaction_helper_install_group(helper,"base",&err))
151 g_error("base: %s",err->message);
153 g_object_unref(helper);
154 g_unsetenv("RAZOR_ROOT");
157 static void test_remove_group(void)
162 PloverPackageSet *installed;
163 PloverTransactionHelper *helper;
164 struct plover_vector *packages;
165 char *pkgs[]={"zip",NULL};
166 root=g_strdup("razor-test-dir-XXXXXX");
167 g_assert(mkdtemp(root));
168 uri=razor_path_to_uri(root);
169 g_setenv("RAZOR_ROOT",uri,TRUE);
170 helper=get_transaction_helper();
171 plover_transaction_helper_set_base(helper,"../yum-repo-test-dir");
172 packages=plover_transaction_helper_group_get_default_packages(helper,
175 g_error("zappy: %s",err->message);
176 if (!plover_install("../yum-repo-test-dir",NULL,packages->strings,&err))
177 g_error("plover_install: %s",err->message);
178 plover_vector_free(packages);
179 installed=plover_package_set_new_from_installed(uri,&err);
181 g_error("%s: %s",root,err->message);
182 plover_transaction_helper_set_installed(helper,installed);
183 g_object_unref(installed);
184 if (!plover_transaction_helper_remove_group(helper,"zappy",&err))
185 g_error("zappy: %s",err->message);
187 g_object_unref(helper);
188 g_unsetenv("RAZOR_ROOT");
193 static void test_update(void)
198 PloverPackageSet *installed;
199 PloverTransactionHelper *helper;
200 root=g_strdup("razor-test-dir-XXXXXX");
201 g_assert(mkdtemp(root));
202 uri=razor_path_to_uri(root);
203 g_setenv("RAZOR_ROOT",uri,TRUE);
205 helper=get_transaction_helper();
206 uri=razor_path_to_uri("../razor-test-dir");
207 installed=plover_package_set_new_from_installed(uri,&err);
210 g_error("../razor-test-dir: %s",err->message);
211 plover_transaction_helper_set_installed(helper,installed);
212 g_object_unref(installed);
213 plover_transaction_helper_set_base(helper,"../yum-repo-test-dir");
214 if (plover_transaction_helper_update(helper,&err))
215 g_error("plover_transaction_helper_update reports work to be done");
216 g_assert_error(err,PLOVER_GENERAL_ERROR,PLOVER_GENERAL_ERROR_NO_WORK);
217 g_object_unref(helper);
218 g_unsetenv("RAZOR_ROOT");
221 struct run_install_baton {
226 RI_STATE_PROGRESS_DELAY,
230 guint eid; /* event ID (or 0) */
231 PloverTransactionHelper *helper;
234 gboolean run_install_tick(gpointer data)
236 gboolean retval=TRUE;
237 struct run_install_baton *baton=data;
239 GtkAssistant *assistant=baton->helper->assistant;
241 page=gtk_assistant_get_nth_page(assistant,
242 gtk_assistant_get_current_page(assistant));
243 g_message("run_install_tick: state is %s, on page %s",
244 baton->state==RI_STATE_INIT?"INIT":
245 baton->state==RI_STATE_SUMMARY?"SUMMARY":
246 baton->state==RI_STATE_PROGRESS?"PROGRESS":
247 baton->state==RI_STATE_PROGRESS_DELAY?"PROGRESS_DELAY":
248 baton->state==RI_STATE_DONE?"DONE":
249 baton->state==RI_STATE_FINISH?"FINISH":
251 gtk_buildable_get_name(GTK_BUILDABLE(page)));
256 if (!assistant || !gtk_widget_get_visible(GTK_WIDGET(assistant)))
259 gtk_button_clicked(GTK_BUTTON(assistant->forward));
261 case RI_STATE_SUMMARY:
262 if (gtk_assistant_get_current_page(assistant)<1)
264 g_assert(gtk_widget_is_sensitive(assistant->apply));
266 gtk_button_clicked(GTK_BUTTON(assistant->apply));
268 case RI_STATE_PROGRESS:
269 if (gtk_assistant_get_current_page(assistant)<2)
271 page=gtk_assistant_get_nth_page(assistant,2);
272 baton->eid=g_timeout_add_seconds(1,run_install_tick,baton);
273 if (!gtk_assistant_get_page_complete(assistant,page))
278 case RI_STATE_PROGRESS_DELAY:
280 baton->eid=g_idle_add_full(G_PRIORITY_LOW,run_install_tick,baton,
283 gtk_button_clicked(GTK_BUTTON(assistant->forward));
286 if (gtk_assistant_get_current_page(assistant)<3)
289 gtk_button_clicked(GTK_BUTTON(assistant->close));
291 case RI_STATE_FINISH:
292 if (assistant && gtk_widget_get_visible(GTK_WIDGET(assistant)))
302 static void test_run_install(void)
307 struct plover_vector *packages;
308 PloverPackageSet *installed;
309 PloverTransactionHelper *helper;
310 struct run_install_baton baton={0,};
311 root=g_strdup("razor-test-dir-XXXXXX");
312 g_assert(mkdtemp(root));
313 uri=razor_path_to_uri(root);
314 g_setenv("RAZOR_ROOT",uri,TRUE);
315 helper=get_transaction_helper();
316 installed=plover_package_set_new();
317 if (!plover_package_set_open(installed,uri,TRUE,&err))
318 g_error("%s: %s",root,err->message);
319 plover_transaction_helper_set_installed(helper,installed);
320 g_object_unref(installed);
321 plover_transaction_helper_set_base(helper,"../yum-repo-test-dir");
322 packages=plover_vector_new();
323 plover_vector_append(packages,"zappy-tools");
324 if (!plover_transaction_helper_install_packages(helper,packages,&err))
325 g_error("zappy-tools: %s",err->message);
327 plover_vector_free(packages);
328 plover_transaction_helper_present(helper);
330 baton.eid=g_idle_add_full(G_PRIORITY_LOW,run_install_tick,&baton,NULL);
332 g_object_unref(helper);
333 g_unsetenv("RAZOR_ROOT");
338 struct run_remove_baton {
343 RR_STATE_PROGRESS_DELAY,
347 guint eid; /* event ID (or 0) */
348 PloverTransactionHelper *helper;
351 gboolean run_remove_tick(gpointer data)
353 gboolean retval=TRUE;
354 struct run_remove_baton *baton=data;
356 GtkAssistant *assistant=baton->helper->assistant;
360 if (!assistant || !gtk_widget_get_visible(GTK_WIDGET(assistant)))
363 gtk_button_clicked(GTK_BUTTON(assistant->forward));
365 case RR_STATE_SUMMARY:
366 if (gtk_assistant_get_current_page(assistant)<1)
368 g_assert(gtk_widget_is_sensitive(assistant->apply));
370 gtk_button_clicked(GTK_BUTTON(assistant->apply));
372 case RR_STATE_PROGRESS:
373 if (gtk_assistant_get_current_page(assistant)<2)
375 page=gtk_assistant_get_nth_page(assistant,2);
376 baton->eid=g_timeout_add_seconds(1,run_remove_tick,baton);
377 if (!gtk_assistant_get_page_complete(assistant,page))
382 case RR_STATE_PROGRESS_DELAY:
384 baton->eid=g_idle_add_full(G_PRIORITY_LOW,run_remove_tick,baton,
387 gtk_button_clicked(GTK_BUTTON(assistant->forward));
390 if (gtk_assistant_get_current_page(assistant)<3)
393 gtk_button_clicked(GTK_BUTTON(assistant->close));
395 case RR_STATE_FINISH:
396 if (assistant && gtk_widget_get_visible(GTK_WIDGET(assistant)))
406 static void test_run_remove(void)
411 struct plover_vector *packages;
412 PloverPackageSet *installed;
413 PloverTransactionHelper *helper;
414 struct run_remove_baton baton={0,};
415 root=g_strdup("razor-test-dir-XXXXXX");
416 g_assert(mkdtemp(root));
417 uri=razor_path_to_uri(root);
418 g_setenv("RAZOR_ROOT",uri,TRUE);
419 helper=get_transaction_helper();
420 plover_transaction_helper_set_base(helper,"../yum-repo-test-dir");
422 plover_transaction_helper_group_get_default_packages(helper,"zappy",&err);
424 g_error("zappy: %s",err->message);
425 if (!plover_install("../yum-repo-test-dir",NULL,packages->strings,&err))
426 g_error("plover_install: %s",err->message);
427 plover_vector_free(packages);
428 installed=plover_package_set_new();
429 if (!plover_package_set_open(installed,uri,TRUE,&err))
430 g_error("%s: %s",root,err->message);
431 plover_transaction_helper_set_installed(helper,installed);
432 g_object_unref(installed);
433 if (!plover_transaction_helper_remove_group(helper,"zappy",&err))
434 g_error("zappy: %s",err->message);
436 plover_transaction_helper_present(helper);
438 baton.eid=g_idle_add_full(G_PRIORITY_LOW,run_remove_tick,&baton,NULL);
440 g_object_unref(helper);
441 g_unsetenv("RAZOR_ROOT");
446 struct run_update_baton {
451 RU_STATE_PROGRESS_DELAY,
455 guint eid; /* event ID (or 0) */
456 PloverTransactionHelper *helper;
459 gboolean run_update_tick(gpointer data)
461 gboolean retval=TRUE;
462 struct run_update_baton *baton=data;
464 GtkAssistant *assistant=baton->helper->assistant;
468 if (!assistant || !gtk_widget_get_visible(GTK_WIDGET(assistant)))
471 gtk_button_clicked(GTK_BUTTON(assistant->forward));
473 case RU_STATE_SUMMARY:
474 if (gtk_assistant_get_current_page(assistant)<1)
476 g_assert(gtk_widget_is_sensitive(assistant->apply));
478 gtk_button_clicked(GTK_BUTTON(assistant->apply));
480 case RU_STATE_PROGRESS:
481 if (gtk_assistant_get_current_page(assistant)<2)
483 page=gtk_assistant_get_nth_page(assistant,2);
484 baton->eid=g_timeout_add_seconds(1,run_update_tick,baton);
485 if (!gtk_assistant_get_page_complete(assistant,page))
490 case RU_STATE_PROGRESS_DELAY:
492 baton->eid=g_idle_add_full(G_PRIORITY_LOW,run_update_tick,baton,
495 gtk_button_clicked(GTK_BUTTON(assistant->forward));
498 if (gtk_assistant_get_current_page(assistant)<3)
501 gtk_button_clicked(GTK_BUTTON(assistant->close));
503 case RU_STATE_FINISH:
504 if (assistant && gtk_widget_get_visible(GTK_WIDGET(assistant)))
514 static void test_run_update(void)
519 struct razor_importer *importer;
520 struct razor_set *downgraded;
521 struct razor_atomic *atomic;
522 struct plover_vector *packages;
523 PloverPackageSet *installed;
524 PloverTransactionHelper *helper;
525 struct run_update_baton baton={0,};
526 root=g_strdup("razor-test-dir-XXXXXX");
527 g_assert(mkdtemp(root));
528 uri=razor_path_to_uri(root);
529 g_setenv("RAZOR_ROOT",uri,TRUE);
530 helper=get_transaction_helper();
531 plover_transaction_helper_set_base(helper,"../yum-repo-test-dir");
532 installed=plover_package_set_new();
533 if (!plover_package_set_open(installed,uri,TRUE,&err))
534 g_error("%s: %s",root,err->message);
535 importer=razor_importer_create();
536 razor_importer_begin_package(importer,"zappy","0-1","noarch");
537 razor_importer_add_details(importer,"","","","");
538 razor_importer_add_property(importer,"zappy",RAZOR_PROPERTY_PROVIDES,"0-1");
539 razor_importer_finish_package(importer);
540 downgraded=razor_importer_finish(importer);
541 atomic=razor_atomic_open("Add downgraded packages");
542 if (!plover_package_set_update(installed,downgraded,atomic) ||
543 razor_atomic_commit(atomic))
544 g_error("%s: %s",root,razor_atomic_get_error_msg(atomic));
545 razor_atomic_destroy(atomic);
546 razor_set_unref(downgraded);
547 plover_transaction_helper_set_installed(helper,installed);
548 g_object_unref(installed);
549 if (!plover_transaction_helper_update(helper,&err))
550 g_error("update: %s",err->message);
552 plover_transaction_helper_present(helper);
554 baton.eid=g_idle_add_full(G_PRIORITY_LOW,run_update_tick,&baton,NULL);
556 g_object_unref(helper);
557 g_unsetenv("RAZOR_ROOT");
562 struct check_vendor_baton {
567 CV_STATE_PROGRESS_DELAY,
571 guint eid; /* event ID (or 0) */
572 PloverTransactionHelper *helper;
575 gboolean check_vendor_tick(gpointer data)
577 gboolean retval=TRUE;
578 struct check_vendor_baton *baton=data;
580 GtkAssistant *assistant=baton->helper->assistant;
584 if (!assistant || !gtk_widget_get_visible(GTK_WIDGET(assistant)))
587 gtk_button_clicked(GTK_BUTTON(assistant->forward));
589 case CV_STATE_SUMMARY:
590 if (gtk_assistant_get_current_page(assistant)<1)
592 g_assert(!gtk_widget_is_sensitive(assistant->apply));
593 w=GTK_WIDGET(gtk_builder_get_object(ui,"SIRemoveExisting"));
594 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w),TRUE);
595 g_assert(gtk_widget_is_sensitive(assistant->apply));
597 gtk_button_clicked(GTK_BUTTON(assistant->apply));
599 case CV_STATE_PROGRESS:
600 if (gtk_assistant_get_current_page(assistant)<2)
602 page=gtk_assistant_get_nth_page(assistant,2);
603 baton->eid=g_timeout_add_seconds(1,check_vendor_tick,baton);
604 if (!gtk_assistant_get_page_complete(assistant,page))
609 case CV_STATE_PROGRESS_DELAY:
611 baton->eid=g_idle_add_full(G_PRIORITY_LOW,check_vendor_tick,baton,
614 gtk_button_clicked(GTK_BUTTON(assistant->forward));
617 if (gtk_assistant_get_current_page(assistant)<3)
620 gtk_button_clicked(GTK_BUTTON(assistant->close));
622 case CV_STATE_FINISH:
623 if (assistant && gtk_widget_get_visible(GTK_WIDGET(assistant)))
633 static void test_check_vendor(void)
639 struct razor_importer *importer;
640 struct razor_set *downgraded;
641 struct razor_atomic *atomic;
642 struct plover_vector *packages;
643 PloverPackageSet *installed;
644 PloverTransactionHelper *helper;
645 struct check_vendor_baton baton={0,};
646 g_setenv("PLOVER_VENDOR_PREFIX","/srv",TRUE);
647 root=g_strdup("razor-test-dir-XXXXXX");
648 g_assert(mkdtemp(root));
649 uri=razor_path_to_uri(root);
650 g_setenv("RAZOR_ROOT",uri,TRUE);
651 helper=get_transaction_helper();
652 plover_transaction_helper_set_check_vendor(helper,TRUE);
653 plover_transaction_helper_set_base(helper,"../yum-repo-test-dir");
654 installed=plover_package_set_new();
655 if (!plover_package_set_open(installed,uri,TRUE,&err))
656 g_error("%s: %s",root,err->message);
657 importer=razor_importer_create();
658 razor_importer_begin_package(importer,"zappy","0-1","noarch");
659 razor_importer_add_details(importer,"","","","");
660 razor_importer_add_property(importer,"zappy",RAZOR_PROPERTY_PROVIDES,"0-1");
661 razor_importer_add_install_prefix(importer,"/test");
662 razor_importer_add_file(importer,"/test/bin/zappy");
663 razor_importer_finish_package(importer);
664 downgraded=razor_importer_finish(importer);
665 atomic=razor_atomic_open("Add downgraded packages");
666 razor_atomic_make_dirs(atomic,uri,"/test/bin/zappy");
667 s=g_build_filename(uri,"test/bin/zappy",NULL);
668 fh=razor_atomic_create_file(atomic,s,S_IRWXU|S_IRWXG|S_IRWXO);
670 razor_atomic_close(atomic,fh);
671 if (!plover_package_set_update(installed,downgraded,atomic) ||
672 razor_atomic_commit(atomic))
673 g_error("%s: %s",root,razor_atomic_get_error_msg(atomic));
674 razor_atomic_destroy(atomic);
675 razor_set_unref(downgraded);
676 plover_transaction_helper_set_installed(helper,installed);
677 g_object_unref(installed);
678 if (!plover_transaction_helper_update(helper,&err))
679 g_error("update: %s",err->message);
681 plover_transaction_helper_present(helper);
683 baton.eid=g_idle_add_full(G_PRIORITY_LOW,check_vendor_tick,&baton,NULL);
685 g_object_unref(helper);
686 g_unsetenv("RAZOR_ROOT");
689 g_unsetenv("PLOVER_VENDOR_PREFIX");
692 static gchar *create_new_root_and_install(gchar **prefix_p,char **pkgs)
698 PloverTransaction *transaction;
699 root=g_strdup("razor-test-dir-XXXXXX");
700 g_assert(mkdtemp(root));
701 uri=razor_path_to_uri(root);
702 g_setenv("RAZOR_ROOT",uri,TRUE);
704 uri=razor_path_to_uri("../yum-repo-test-dir/repodata/comps.xml");
705 comps=plover_comps_new_from_uri(uri,&err);
708 g_error("../yum-repo-test-dir/repodata/comps.xml: %s",err->message);
709 prefix=plover_comps_get_default_prefix(comps);
710 plover_comps_free(comps);
711 transaction=plover_transaction_new_install("../yum-repo-test-dir",prefix,
714 g_error("../yum-repo-test-dir: %s",err->message);
715 g_assert(plover_transaction_commit(transaction,NULL,NULL));
716 g_object_unref(transaction);
725 static check_file(const char *root,const char *path)
728 s=g_build_filename(root,path,NULL);
729 g_assert(g_file_test(s,G_FILE_TEST_EXISTS));
733 static check_no_file(const char *root,const char *path)
736 s=g_build_filename(root,path,NULL);
737 g_assert(!g_file_test(s,G_FILE_TEST_EXISTS));
742 * Test that installing from a repository which is marked as distribution-local
743 * on top of an existing global installation works if prefix is NULL
744 * (which is the case on UNIX if PLOVER_VENDOR_PREFIX is not set).
746 static void test_unprefixed_distribution_local(void)
750 char *pkgs[]={"zap",NULL};
751 struct plover_vector *packages;
752 PloverPackageSet *installed;
753 PloverTransactionHelper *helper;
754 struct run_install_baton baton={0,};
755 g_unsetenv("PLOVER_VENDOR_PREFIX");
756 root=create_new_root_and_install(NULL,pkgs);
757 check_file(root,"/usr/bin/zap");
758 helper=get_transaction_helper();
759 plover_transaction_helper_set_check_vendor(helper,TRUE);
760 plover_transaction_helper_set_base(helper,"../distribution-local-test-dir");
761 packages=plover_vector_new();
762 plover_vector_append(packages,"zappy");
763 if (!plover_transaction_helper_install_packages(helper,packages,&err))
764 g_error("zappy: %s",err->message);
766 plover_vector_free(packages);
767 plover_transaction_helper_present(helper);
769 baton.eid=g_idle_add_full(G_PRIORITY_LOW,run_install_tick,&baton,NULL);
771 g_object_unref(helper);
772 check_file(root,"/usr/bin/zappy");
774 g_unsetenv("RAZOR_ROOT");
778 * Test that installing from a repository which is marked as distribution-local
779 * on top of an existing global installation requires removing the existing
780 * installation if prefix is non-NULL (which is the case if PLOVER_VENDOR_PREFIX
783 static void test_prefixed_distribution_local(void)
788 char *pkgs[]={"zap",NULL};
789 struct plover_vector *packages;
790 PloverPackageSet *installed;
791 PloverTransactionHelper *helper;
792 struct check_vendor_baton baton={0,};
793 g_setenv("PLOVER_VENDOR_PREFIX","/srv",TRUE);
794 helper=get_transaction_helper();
795 plover_transaction_helper_set_check_vendor(helper,TRUE);
796 plover_transaction_helper_set_base(helper,"../distribution-local-test-dir");
797 root=create_new_root_and_install(&prefix,pkgs);
798 s=g_build_filename(prefix,"bin/zap",NULL);
801 packages=plover_vector_new();
802 plover_vector_append(packages,"filesystem");
803 if (!plover_transaction_helper_install_packages(helper,packages,&err))
804 g_error("filesystem: %s",err->message);
806 plover_vector_free(packages);
807 plover_transaction_helper_present(helper);
809 baton.eid=g_idle_add_full(G_PRIORITY_LOW,check_vendor_tick,&baton,NULL);
811 g_object_unref(helper);
812 s=g_build_filename(prefix,"bin/zap",NULL);
813 check_no_file(root,s);
815 check_no_file(root,"/media");
818 g_unsetenv("RAZOR_ROOT");
821 struct set_error_baton {
826 PloverTransactionHelper *helper;
830 * This handler may be called as either an event (ie., idle or timeout)
831 * or as a (swapped) signal. In the latter case, the return is ignored.
833 gboolean set_error_tick(gpointer data)
835 struct set_error_baton *baton=data;
838 dlg=GTK_DIALOG(baton->helper->error_dialog);
842 if (!dlg || !gtk_widget_get_visible(GTK_WIDGET(dlg)))
844 button=gtk_dialog_get_widget_for_response(dlg,GTK_RESPONSE_CLOSE);
846 gtk_button_clicked(GTK_BUTTON(button));
848 case SE_STATE_FINISH:
849 if (dlg && gtk_widget_get_visible(GTK_WIDGET(dlg)))
858 static void test_set_error(void)
864 const GError *err2=NULL;
865 PloverPackageSet *installed;
866 PloverTransactionHelper *helper;
867 struct set_error_baton baton={0,};
868 root=g_strdup("razor-test-dir-XXXXXX");
869 g_assert(mkdtemp(root));
870 uri=razor_path_to_uri(root);
872 g_setenv("RAZOR_ROOT",uri,TRUE);
874 helper=get_transaction_helper();
875 uri=razor_path_to_uri("../razor-test-dir");
876 installed=plover_package_set_new_from_installed(uri,&err);
879 g_error("../razor-test-dir: %s",err->message);
880 plover_transaction_helper_set_installed(helper,installed);
881 g_object_unref(installed);
882 plover_transaction_helper_set_base(helper,"../yum-repo-test-dir");
883 if (!plover_transaction_helper_update(helper,&err))
884 plover_transaction_helper_set_error(helper,err,"Expected error");
885 g_assert(plover_transaction_helper_get_visible(helper));
886 errmsg=plover_transaction_helper_get_error(helper,&err2);
887 g_assert_cmpstr(errmsg,==,"Expected error");
888 g_assert_error(err2,err->domain,err->code);
889 plover_transaction_helper_present(helper);
891 g_idle_add_full(G_PRIORITY_LOW,set_error_tick,&baton,NULL);
894 g_object_unref(helper);
895 g_unsetenv("RAZOR_ROOT");
898 int main(int argc,char **argv)
903 * Note that because g_test_init() handles --help,
904 * these options will not appear in the output.
906 GOptionEntry options[]={
907 {"manual",0,0,G_OPTION_ARG_NONE,&manual_mode,
908 "Disable automatic mode",NULL},
911 g_test_init(&argc,&argv,NULL);
912 g_setenv("GTK_MODULES","",TRUE);
913 g_setenv("GTK2_RC_FILES","/dev/null",TRUE);
914 gtk_disable_setlocale();
915 setlocale(LC_ALL,"C");
916 g_test_bug_base("mailto:ali@juiblex.co.uk");
917 if (!gtk_init_with_args(&argc,&argv,NULL,options,NULL,&err))
919 g_printf("%s\n",err->message);
922 g_test_add_func("/transactionhelper/init",test_init);
923 g_test_add_func("/transactionhelper/basic-properties",
924 test_basic_properties);
925 g_test_add_func("/transactionhelper/install-group",test_install_group);
926 g_test_add_func("/transactionhelper/remove-group",test_remove_group);
927 g_test_add_func("/transactionhelper/update",test_update);
928 g_test_add_func("/transactionhelper/run-install",test_run_install);
929 g_test_add_func("/transactionhelper/run-remove",test_run_remove);
930 g_test_add_func("/transactionhelper/run-update",test_run_update);
931 g_test_add_func("/transactionhelper/check-vendor",test_check_vendor);
932 g_test_add_func("/transactionhelper/unprefixed-distribution-local",
933 test_unprefixed_distribution_local);
934 g_test_add_func("/transactionhelper/prefixed-distribution-local",
935 test_prefixed_distribution_local);
936 g_test_add_func("/transactionhelper/set-error",test_set_error);