ali@38: /* ali@38: * Copyright (C) 2016 J. Ali Harlow ali@38: * ali@38: * This program is free software; you can redistribute it and/or modify ali@38: * it under the terms of the GNU General Public License as published by ali@38: * the Free Software Foundation; either version 2 of the License, or ali@38: * (at your option) any later version. ali@38: * ali@38: * This program is distributed in the hope that it will be useful, ali@38: * but WITHOUT ANY WARRANTY; without even the implied warranty of ali@38: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ali@38: * GNU General Public License for more details. ali@38: * ali@38: * You should have received a copy of the GNU General Public License along ali@38: * with this program; if not, write to the Free Software Foundation, Inc., ali@38: * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. ali@38: */ ali@38: ali@38: #include ali@38: #include ali@38: #include ali@38: #include ali@38: #include ali@38: #include ali@38: #include ali@38: #include ali@38: #include ali@38: ali@38: GtkBuilder *ui; ali@38: gboolean manual_mode=FALSE; ali@38: ali@38: PloverTransactionHelper *get_transaction_helper(void) ali@38: { ali@38: const char *dir; ali@38: gchar *s; ali@38: GError *err=NULL; ali@38: PloverTransactionHelper *helper; ali@38: dir=g_getenv("gtk_srcdir"); ali@38: s=g_build_filename(dir,"software-installation.ui",NULL); ali@38: ui=gtk_builder_new(); ali@38: if (!gtk_builder_add_from_file(ui,s,&err)) ali@38: g_error("%s: %s",s,err->message); ali@38: g_free(s); ali@38: helper=plover_transaction_helper_new(ui); ali@38: g_object_unref(ui); ali@38: return helper; ali@38: } ali@38: ali@38: static void test_init(void) ali@38: { ali@38: PloverTransactionHelper *helper; ali@38: helper=get_transaction_helper(); ali@38: g_object_unref(helper); ali@38: } ali@38: ali@38: static void test_basic_properties(void) ali@38: { ali@38: const char *prefix; ali@38: GError *err=NULL; ali@38: struct comps *comps; ali@38: PloverTransactionHelper *helper; ali@38: PloverPackageSet *installed; ali@38: PloverRepository *upstream; ali@38: upstream=plover_repository_new_from_yum("../yum-repo-test-dir",&err); ali@38: if (!upstream) ali@38: g_error("../yum-repo-test-dir: %s",err->message); ali@38: installed=plover_package_set_new_from_installed("../razor-test-dir",&err); ali@38: if (!installed) ali@38: g_error("../razor-test-dir: %s",err->message); ali@38: helper=get_transaction_helper(); ali@38: g_assert(!plover_transaction_helper_get_visible(helper)); ali@38: plover_transaction_helper_set_installed(helper,installed); ali@38: g_assert(plover_transaction_helper_get_installed(helper)==installed); ali@38: plover_transaction_helper_set_upstream(helper,upstream); ali@38: g_assert(plover_transaction_helper_get_upstream(helper,&err)==upstream); ali@38: g_assert(!err); ali@38: plover_transaction_helper_set_base(helper,"../yum-repo-test-dir"); ali@38: g_assert_cmpstr(plover_transaction_helper_get_base(helper),==,"../yum-repo-test-dir"); ali@38: comps=plover_transaction_helper_get_comps(helper,&err); ali@38: g_assert(!err); ali@38: g_assert(plover_comps_lookup_group(comps,"base")); ali@38: prefix=plover_transaction_helper_get_prefix(helper,&err); ali@38: g_assert(!err); ali@38: g_assert_cmpstr(prefix,==,plover_default_prefix_for_vendor("Acme Corporation")); ali@38: g_assert(!plover_transaction_helper_get_visible(helper)); ali@38: g_assert(!plover_transaction_helper_get_error(helper,NULL)); ali@38: g_object_unref(upstream); ali@38: g_object_unref(installed); ali@38: g_object_unref(helper); ali@38: } ali@38: ali@38: static void test_install_group(void) ali@38: { ali@42: gchar *root,*root_uri; ali@38: GError *err=NULL; ali@42: GFile *file; ali@38: PloverPackageSet *installed; ali@38: PloverTransactionHelper *helper; ali@38: root=g_strdup("razor-test-dir-XXXXXX"); ali@38: g_assert(mkdtemp(root)); ali@42: file=g_file_new_for_path(root); ali@38: g_free(root); ali@42: root_uri=g_file_get_uri(file); ali@42: g_object_unref(file); ali@42: g_setenv("RAZOR_ROOT",root_uri,TRUE); ali@42: g_free(root_uri); ali@38: helper=get_transaction_helper(); ali@38: installed=plover_package_set_new_from_installed("../razor-test-dir",&err); ali@38: if (!installed) ali@38: g_error("../razor-test-dir: %s",err->message); ali@38: plover_transaction_helper_set_installed(helper,installed); ali@38: g_object_unref(installed); ali@38: plover_transaction_helper_set_base(helper,"../yum-repo-test-dir"); ali@38: if (!plover_transaction_helper_install_group(helper,"base",&err)) ali@38: g_error("base: %s",err->message); ali@38: g_assert(!err); ali@38: g_object_unref(helper); ali@38: g_unsetenv("RAZOR_ROOT"); ali@38: } ali@38: ali@38: static void test_remove_group(void) ali@38: { ali@42: gchar *root,*root_uri; ali@38: GError *err=NULL; ali@42: GFile *file; ali@38: PloverPackageSet *installed; ali@38: PloverTransactionHelper *helper; ali@38: struct plover_vector *packages; ali@38: char *pkgs[]={"zip",NULL}; ali@38: root=g_strdup("razor-test-dir-XXXXXX"); ali@38: g_assert(mkdtemp(root)); ali@42: file=g_file_new_for_path(root); ali@42: root_uri=g_file_get_uri(file); ali@42: g_object_unref(file); ali@42: g_setenv("RAZOR_ROOT",root_uri,TRUE); ali@42: g_free(root_uri); ali@38: helper=get_transaction_helper(); ali@38: plover_transaction_helper_set_base(helper,"../yum-repo-test-dir"); ali@38: packages=plover_transaction_helper_group_get_default_packages(helper, ali@38: "zappy",&err); ali@38: if (!packages) ali@38: g_error("zappy: %s",err->message); ali@38: if (!plover_install("../yum-repo-test-dir",NULL,packages->strings,&err)) ali@38: g_error("plover_install: %s",err->message); ali@38: plover_vector_free(packages); ali@38: installed=plover_package_set_new_from_installed(root,&err); ali@38: if (!installed) ali@38: g_error("%s: %s",root,err->message); ali@38: plover_transaction_helper_set_installed(helper,installed); ali@38: g_object_unref(installed); ali@38: if (!plover_transaction_helper_remove_group(helper,"zappy",&err)) ali@38: g_error("zappy: %s",err->message); ali@38: g_assert(!err); ali@38: g_object_unref(helper); ali@38: g_unsetenv("RAZOR_ROOT"); ali@38: g_free(root); ali@38: } ali@38: ali@38: static void test_update(void) ali@38: { ali@42: gchar *root,*root_uri; ali@38: GError *err=NULL; ali@42: GFile *file; ali@38: PloverPackageSet *installed; ali@38: PloverTransactionHelper *helper; ali@38: root=g_strdup("razor-test-dir-XXXXXX"); ali@38: g_assert(mkdtemp(root)); ali@42: file=g_file_new_for_path(root); ali@38: g_free(root); ali@42: root_uri=g_file_get_uri(file); ali@42: g_object_unref(file); ali@42: g_setenv("RAZOR_ROOT",root_uri,TRUE); ali@42: g_free(root_uri); ali@38: helper=get_transaction_helper(); ali@38: installed=plover_package_set_new_from_installed("../razor-test-dir",&err); ali@38: if (!installed) ali@38: g_error("../razor-test-dir: %s",err->message); ali@38: plover_transaction_helper_set_installed(helper,installed); ali@38: g_object_unref(installed); ali@38: plover_transaction_helper_set_base(helper,"../yum-repo-test-dir"); ali@38: if (plover_transaction_helper_update(helper,&err)) ali@38: g_error("plover_transaction_helper_update reports work to be done"); ali@38: g_assert_error(err,PLOVER_GENERAL_ERROR,PLOVER_GENERAL_ERROR_NO_WORK); ali@38: g_object_unref(helper); ali@38: g_unsetenv("RAZOR_ROOT"); ali@38: } ali@38: ali@38: struct run_install_baton { ali@38: enum { ali@38: RI_STATE_INIT = 0, ali@38: RI_STATE_SUMMARY, ali@38: RI_STATE_PROGRESS, ali@38: RI_STATE_PROGRESS_DELAY, ali@38: RI_STATE_DONE, ali@38: RI_STATE_FINISH ali@38: } state; ali@38: guint eid; /* event ID (or 0) */ ali@38: PloverTransactionHelper *helper; ali@38: }; ali@38: ali@38: gboolean run_install_tick(gpointer data) ali@38: { ali@38: gboolean retval=TRUE; ali@38: struct run_install_baton *baton=data; ali@38: GtkWidget *page; ali@38: GtkAssistant *assistant=baton->helper->assistant; ali@38: switch(baton->state) ali@38: { ali@38: case RI_STATE_INIT: ali@38: if (!assistant || !gtk_widget_get_visible(GTK_WIDGET(assistant))) ali@38: return TRUE; ali@38: if (!manual_mode) ali@38: gtk_button_clicked(GTK_BUTTON(assistant->forward)); ali@38: break; ali@38: case RI_STATE_SUMMARY: ali@38: if (gtk_assistant_get_current_page(assistant)<1) ali@38: return TRUE; ali@38: if (!manual_mode) ali@38: gtk_button_clicked(GTK_BUTTON(assistant->apply)); ali@38: break; ali@38: case RI_STATE_PROGRESS: ali@38: if (gtk_assistant_get_current_page(assistant)<2) ali@38: return TRUE; ali@38: page=gtk_assistant_get_nth_page(assistant,2); ali@38: baton->eid=g_timeout_add_seconds(1,run_install_tick,baton); ali@38: if (!gtk_assistant_get_page_complete(assistant,page)) ali@38: return FALSE; ali@38: else ali@38: retval=FALSE; ali@38: break; ali@38: case RI_STATE_PROGRESS_DELAY: ali@38: retval=FALSE; ali@38: baton->eid=g_idle_add_full(G_PRIORITY_LOW,run_install_tick,baton, ali@38: NULL); ali@38: if (!manual_mode) ali@38: gtk_button_clicked(GTK_BUTTON(assistant->forward)); ali@38: break; ali@38: case RI_STATE_DONE: ali@38: if (gtk_assistant_get_current_page(assistant)<3) ali@38: return TRUE; ali@38: if (!manual_mode) ali@38: gtk_button_clicked(GTK_BUTTON(assistant->close)); ali@38: break; ali@38: case RI_STATE_FINISH: ali@38: if (assistant && gtk_widget_get_visible(GTK_WIDGET(assistant))) ali@38: return TRUE; ali@38: gtk_main_quit(); ali@38: baton->eid=0; ali@38: return FALSE; ali@38: } ali@38: baton->state++; ali@38: return retval; ali@38: } ali@38: ali@38: static void test_run_install(void) ali@38: { ali@42: gchar *root,*root_uri; ali@38: GError *err=NULL; ali@42: GFile *file; ali@38: struct plover_vector *packages; ali@38: PloverPackageSet *installed; ali@38: PloverTransactionHelper *helper; ali@38: struct run_install_baton baton={0,}; ali@38: root=g_strdup("razor-test-dir-XXXXXX"); ali@38: g_assert(mkdtemp(root)); ali@42: file=g_file_new_for_path(root); ali@42: root_uri=g_file_get_uri(file); ali@42: g_object_unref(file); ali@42: g_setenv("RAZOR_ROOT",root_uri,TRUE); ali@42: g_free(root_uri); ali@38: helper=get_transaction_helper(); ali@38: installed=plover_package_set_new(); ali@38: if (!plover_package_set_open(installed,root,TRUE,&err)) ali@38: g_error("%s: %s",root,err->message); ali@38: plover_transaction_helper_set_installed(helper,installed); ali@38: g_object_unref(installed); ali@38: plover_transaction_helper_set_base(helper,"../yum-repo-test-dir"); ali@38: packages=plover_vector_new(); ali@38: plover_vector_append(packages,"zappy-tools"); ali@38: if (!plover_transaction_helper_install_packages(helper,packages,&err)) ali@38: g_error("zappy-tools: %s",err->message); ali@38: g_assert(!err); ali@38: plover_vector_free(packages); ali@38: plover_transaction_helper_present(helper); ali@38: baton.helper=helper; ali@38: baton.eid=g_idle_add_full(G_PRIORITY_LOW,run_install_tick,&baton,NULL); ali@38: gtk_main(); ali@38: g_object_unref(helper); ali@38: g_unsetenv("RAZOR_ROOT"); ali@38: g_free(root); ali@38: } ali@38: ali@38: struct run_remove_baton { ali@38: enum { ali@38: RR_STATE_INIT = 0, ali@38: RR_STATE_SUMMARY, ali@38: RR_STATE_PROGRESS, ali@38: RR_STATE_PROGRESS_DELAY, ali@38: RR_STATE_DONE, ali@38: RR_STATE_FINISH ali@38: } state; ali@38: guint eid; /* event ID (or 0) */ ali@38: PloverTransactionHelper *helper; ali@38: }; ali@38: ali@38: gboolean run_remove_tick(gpointer data) ali@38: { ali@38: gboolean retval=TRUE; ali@38: struct run_remove_baton *baton=data; ali@38: GtkWidget *page; ali@38: GtkAssistant *assistant=baton->helper->assistant; ali@38: switch(baton->state) ali@38: { ali@38: case RR_STATE_INIT: ali@38: if (!assistant || !gtk_widget_get_visible(GTK_WIDGET(assistant))) ali@38: return TRUE; ali@38: if (!manual_mode) ali@38: gtk_button_clicked(GTK_BUTTON(assistant->forward)); ali@38: break; ali@38: case RR_STATE_SUMMARY: ali@38: if (gtk_assistant_get_current_page(assistant)<1) ali@38: return TRUE; ali@38: if (!manual_mode) ali@38: gtk_button_clicked(GTK_BUTTON(assistant->apply)); ali@38: break; ali@38: case RR_STATE_PROGRESS: ali@38: if (gtk_assistant_get_current_page(assistant)<2) ali@38: return TRUE; ali@38: page=gtk_assistant_get_nth_page(assistant,2); ali@38: baton->eid=g_timeout_add_seconds(1,run_remove_tick,baton); ali@38: if (!gtk_assistant_get_page_complete(assistant,page)) ali@38: return FALSE; ali@38: else ali@38: retval=FALSE; ali@38: break; ali@38: case RR_STATE_PROGRESS_DELAY: ali@38: retval=FALSE; ali@38: baton->eid=g_idle_add_full(G_PRIORITY_LOW,run_remove_tick,baton, ali@38: NULL); ali@38: if (!manual_mode) ali@38: gtk_button_clicked(GTK_BUTTON(assistant->forward)); ali@38: break; ali@38: case RR_STATE_DONE: ali@38: if (gtk_assistant_get_current_page(assistant)<3) ali@38: return TRUE; ali@38: if (!manual_mode) ali@38: gtk_button_clicked(GTK_BUTTON(assistant->close)); ali@38: break; ali@38: case RR_STATE_FINISH: ali@38: if (assistant && gtk_widget_get_visible(GTK_WIDGET(assistant))) ali@38: return TRUE; ali@38: gtk_main_quit(); ali@38: baton->eid=0; ali@38: return FALSE; ali@38: } ali@38: baton->state++; ali@38: return retval; ali@38: } ali@38: ali@38: static void test_run_remove(void) ali@38: { ali@42: gchar *root,*root_uri; ali@38: GError *err=NULL; ali@42: GFile *file; ali@38: struct plover_vector *packages; ali@38: PloverPackageSet *installed; ali@38: PloverTransactionHelper *helper; ali@38: struct run_remove_baton baton={0,}; ali@38: root=g_strdup("razor-test-dir-XXXXXX"); ali@38: g_assert(mkdtemp(root)); ali@42: file=g_file_new_for_path(root); ali@42: root_uri=g_file_get_uri(file); ali@42: g_object_unref(file); ali@42: g_setenv("RAZOR_ROOT",root_uri,TRUE); ali@42: g_free(root_uri); ali@38: helper=get_transaction_helper(); ali@38: plover_transaction_helper_set_base(helper,"../yum-repo-test-dir"); ali@38: packages= ali@38: plover_transaction_helper_group_get_default_packages(helper,"zappy",&err); ali@38: if (!packages) ali@38: g_error("zappy: %s",err->message); ali@38: if (!plover_install("../yum-repo-test-dir",NULL,packages->strings,&err)) ali@38: g_error("plover_install: %s",err->message); ali@38: plover_vector_free(packages); ali@38: installed=plover_package_set_new(); ali@38: if (!plover_package_set_open(installed,root,TRUE,&err)) ali@38: g_error("%s: %s",root,err->message); ali@38: plover_transaction_helper_set_installed(helper,installed); ali@38: g_object_unref(installed); ali@38: if (!plover_transaction_helper_remove_group(helper,"zappy",&err)) ali@38: g_error("zappy: %s",err->message); ali@38: g_assert(!err); ali@38: plover_transaction_helper_present(helper); ali@38: baton.helper=helper; ali@38: baton.eid=g_idle_add_full(G_PRIORITY_LOW,run_remove_tick,&baton,NULL); ali@38: gtk_main(); ali@38: g_object_unref(helper); ali@38: g_unsetenv("RAZOR_ROOT"); ali@38: g_free(root); ali@38: } ali@38: ali@38: struct run_update_baton { ali@38: enum { ali@38: RU_STATE_INIT = 0, ali@38: RU_STATE_SUMMARY, ali@38: RU_STATE_PROGRESS, ali@38: RU_STATE_PROGRESS_DELAY, ali@38: RU_STATE_DONE, ali@38: RU_STATE_FINISH ali@38: } state; ali@38: guint eid; /* event ID (or 0) */ ali@38: PloverTransactionHelper *helper; ali@38: }; ali@38: ali@38: gboolean run_update_tick(gpointer data) ali@38: { ali@38: gboolean retval=TRUE; ali@38: struct run_update_baton *baton=data; ali@38: GtkWidget *page; ali@38: GtkAssistant *assistant=baton->helper->assistant; ali@38: switch(baton->state) ali@38: { ali@38: case RU_STATE_INIT: ali@38: if (!assistant || !gtk_widget_get_visible(GTK_WIDGET(assistant))) ali@38: return TRUE; ali@38: if (!manual_mode) ali@38: gtk_button_clicked(GTK_BUTTON(assistant->forward)); ali@38: break; ali@38: case RU_STATE_SUMMARY: ali@38: if (gtk_assistant_get_current_page(assistant)<1) ali@38: return TRUE; ali@38: if (!manual_mode) ali@38: gtk_button_clicked(GTK_BUTTON(assistant->apply)); ali@38: break; ali@38: case RU_STATE_PROGRESS: ali@38: if (gtk_assistant_get_current_page(assistant)<2) ali@38: return TRUE; ali@38: page=gtk_assistant_get_nth_page(assistant,2); ali@38: baton->eid=g_timeout_add_seconds(1,run_update_tick,baton); ali@38: if (!gtk_assistant_get_page_complete(assistant,page)) ali@38: return FALSE; ali@38: else ali@38: retval=FALSE; ali@38: break; ali@38: case RU_STATE_PROGRESS_DELAY: ali@38: retval=FALSE; ali@38: baton->eid=g_idle_add_full(G_PRIORITY_LOW,run_update_tick,baton, ali@38: NULL); ali@38: if (!manual_mode) ali@38: gtk_button_clicked(GTK_BUTTON(assistant->forward)); ali@38: break; ali@38: case RU_STATE_DONE: ali@38: if (gtk_assistant_get_current_page(assistant)<3) ali@38: return TRUE; ali@38: if (!manual_mode) ali@38: gtk_button_clicked(GTK_BUTTON(assistant->close)); ali@38: break; ali@38: case RU_STATE_FINISH: ali@38: if (assistant && gtk_widget_get_visible(GTK_WIDGET(assistant))) ali@38: return TRUE; ali@38: gtk_main_quit(); ali@38: baton->eid=0; ali@38: return FALSE; ali@38: } ali@38: baton->state++; ali@38: return retval; ali@38: } ali@38: ali@38: static void test_run_update(void) ali@38: { ali@42: gchar *root,*root_uri; ali@38: GError *err=NULL; ali@42: GFile *file; ali@38: struct razor_importer *importer; ali@38: struct razor_set *downgraded; ali@38: struct razor_atomic *atomic; ali@38: struct plover_vector *packages; ali@38: PloverPackageSet *installed; ali@38: PloverTransactionHelper *helper; ali@38: struct run_update_baton baton={0,}; ali@38: root=g_strdup("razor-test-dir-XXXXXX"); ali@38: g_assert(mkdtemp(root)); ali@42: file=g_file_new_for_path(root); ali@42: root_uri=g_file_get_uri(file); ali@42: g_object_unref(file); ali@42: g_setenv("RAZOR_ROOT",root_uri,TRUE); ali@42: g_free(root_uri); ali@38: helper=get_transaction_helper(); ali@38: plover_transaction_helper_set_base(helper,"../yum-repo-test-dir"); ali@38: installed=plover_package_set_new(); ali@38: if (!plover_package_set_open(installed,root,TRUE,&err)) ali@38: g_error("%s: %s",root,err->message); ali@38: importer=razor_importer_create(); ali@38: razor_importer_begin_package(importer,"zappy","0-1","noarch"); ali@38: razor_importer_add_details(importer,"","","",""); ali@38: razor_importer_add_property(importer,"zappy",RAZOR_PROPERTY_PROVIDES,"0-1"); ali@38: razor_importer_finish_package(importer); ali@38: downgraded=razor_importer_finish(importer); ali@38: atomic=razor_atomic_open("Add downgraded packages"); ali@38: if (!plover_package_set_update(installed,downgraded,atomic) || ali@38: razor_atomic_commit(atomic)) ali@38: g_error("%s: %s",root,razor_atomic_get_error_msg(atomic)); ali@38: razor_atomic_destroy(atomic); ali@38: razor_set_unref(downgraded); ali@38: plover_transaction_helper_set_installed(helper,installed); ali@38: g_object_unref(installed); ali@38: if (!plover_transaction_helper_update(helper,&err)) ali@38: g_error("update: %s",err->message); ali@38: g_assert(!err); ali@38: plover_transaction_helper_present(helper); ali@38: baton.helper=helper; ali@38: baton.eid=g_idle_add_full(G_PRIORITY_LOW,run_update_tick,&baton,NULL); ali@38: gtk_main(); ali@38: g_object_unref(helper); ali@38: g_unsetenv("RAZOR_ROOT"); ali@38: g_free(root); ali@38: } ali@38: ali@38: struct check_vendor_baton { ali@38: enum { ali@38: CV_STATE_INIT = 0, ali@38: CV_STATE_SUMMARY, ali@38: CV_STATE_PROGRESS, ali@38: CV_STATE_PROGRESS_DELAY, ali@38: CV_STATE_DONE, ali@38: CV_STATE_FINISH ali@38: } state; ali@38: guint eid; /* event ID (or 0) */ ali@38: PloverTransactionHelper *helper; ali@38: }; ali@38: ali@38: gboolean check_vendor_tick(gpointer data) ali@38: { ali@38: gboolean retval=TRUE; ali@38: struct check_vendor_baton *baton=data; ali@38: GtkWidget *page,*w; ali@38: GtkAssistant *assistant=baton->helper->assistant; ali@38: switch(baton->state) ali@38: { ali@38: case CV_STATE_INIT: ali@38: if (!assistant || !gtk_widget_get_visible(GTK_WIDGET(assistant))) ali@38: return TRUE; ali@38: if (!manual_mode) ali@38: gtk_button_clicked(GTK_BUTTON(assistant->forward)); ali@38: break; ali@38: case CV_STATE_SUMMARY: ali@38: if (gtk_assistant_get_current_page(assistant)<1) ali@38: return TRUE; ali@38: g_assert(!gtk_widget_is_sensitive(assistant->apply)); ali@38: w=GTK_WIDGET(gtk_builder_get_object(ui,"SIRemoveExisting")); ali@38: gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w),TRUE); ali@38: g_assert(gtk_widget_is_sensitive(assistant->apply)); ali@38: if (!manual_mode) ali@38: gtk_button_clicked(GTK_BUTTON(assistant->apply)); ali@38: break; ali@38: case CV_STATE_PROGRESS: ali@38: if (gtk_assistant_get_current_page(assistant)<2) ali@38: return TRUE; ali@38: page=gtk_assistant_get_nth_page(assistant,2); ali@38: baton->eid=g_timeout_add_seconds(1,check_vendor_tick,baton); ali@38: if (!gtk_assistant_get_page_complete(assistant,page)) ali@38: return FALSE; ali@38: else ali@38: retval=FALSE; ali@38: break; ali@38: case CV_STATE_PROGRESS_DELAY: ali@38: retval=FALSE; ali@38: baton->eid=g_idle_add_full(G_PRIORITY_LOW,check_vendor_tick,baton, ali@38: NULL); ali@38: if (!manual_mode) ali@38: gtk_button_clicked(GTK_BUTTON(assistant->forward)); ali@38: break; ali@38: case CV_STATE_DONE: ali@38: if (gtk_assistant_get_current_page(assistant)<3) ali@38: return TRUE; ali@38: if (!manual_mode) ali@38: gtk_button_clicked(GTK_BUTTON(assistant->close)); ali@38: break; ali@38: case CV_STATE_FINISH: ali@38: if (assistant && gtk_widget_get_visible(GTK_WIDGET(assistant))) ali@38: return TRUE; ali@38: gtk_main_quit(); ali@38: baton->eid=0; ali@38: return FALSE; ali@38: } ali@38: baton->state++; ali@38: return retval; ali@38: } ali@38: ali@38: static void test_check_vendor(void) ali@38: { ali@38: int fh; ali@42: gchar *root,*root_uri,*s; ali@42: GFile *file; ali@38: GError *err=NULL; ali@38: struct razor_importer *importer; ali@38: struct razor_set *downgraded; ali@38: struct razor_atomic *atomic; ali@38: struct plover_vector *packages; ali@38: PloverPackageSet *installed; ali@38: PloverTransactionHelper *helper; ali@38: struct run_update_baton baton={0,}; ali@38: g_setenv("PLOVER_VENDOR_PREFIX","/srv",TRUE); ali@38: root=g_strdup("razor-test-dir-XXXXXX"); ali@38: g_assert(mkdtemp(root)); ali@42: file=g_file_new_for_path(root); ali@42: root_uri=g_file_get_uri(file); ali@42: g_object_unref(file); ali@42: g_setenv("RAZOR_ROOT",root_uri,TRUE); ali@38: helper=get_transaction_helper(); ali@38: plover_transaction_helper_set_check_vendor(helper,TRUE); ali@38: plover_transaction_helper_set_base(helper,"../yum-repo-test-dir"); ali@38: installed=plover_package_set_new(); ali@38: if (!plover_package_set_open(installed,root,TRUE,&err)) ali@38: g_error("%s: %s",root,err->message); ali@38: importer=razor_importer_create(); ali@38: razor_importer_begin_package(importer,"zappy","0-1","noarch"); ali@38: razor_importer_add_details(importer,"","","",""); ali@38: razor_importer_add_property(importer,"zappy",RAZOR_PROPERTY_PROVIDES,"0-1"); ali@38: razor_importer_add_install_prefix(importer,"/test"); ali@38: razor_importer_add_file(importer,"/test/bin/zappy"); ali@38: razor_importer_finish_package(importer); ali@38: downgraded=razor_importer_finish(importer); ali@38: atomic=razor_atomic_open("Add downgraded packages"); ali@42: razor_atomic_make_dirs(atomic,root_uri,"/test/bin/zappy"); ali@42: s=g_build_filename(root_uri,"test/bin/zappy",NULL); ali@38: fh=razor_atomic_create_file(atomic,s,S_IRWXU|S_IRWXG|S_IRWXO); ali@38: g_free(s); ali@38: razor_atomic_close(atomic,fh); ali@38: if (!plover_package_set_update(installed,downgraded,atomic) || ali@38: razor_atomic_commit(atomic)) ali@38: g_error("%s: %s",root,razor_atomic_get_error_msg(atomic)); ali@38: razor_atomic_destroy(atomic); ali@38: razor_set_unref(downgraded); ali@38: plover_transaction_helper_set_installed(helper,installed); ali@38: g_object_unref(installed); ali@38: if (!plover_transaction_helper_update(helper,&err)) ali@38: g_error("update: %s",err->message); ali@38: g_assert(!err); ali@38: plover_transaction_helper_present(helper); ali@38: baton.helper=helper; ali@38: baton.eid=g_idle_add_full(G_PRIORITY_LOW,check_vendor_tick,&baton,NULL); ali@38: gtk_main(); ali@38: g_object_unref(helper); ali@38: g_unsetenv("RAZOR_ROOT"); ali@38: g_free(root); ali@42: g_free(root_uri); ali@38: g_unsetenv("PLOVER_VENDOR_PREFIX"); ali@38: } ali@38: ali@38: struct set_error_baton { ali@38: enum { ali@38: SE_STATE_INIT = 0, ali@38: SE_STATE_FINISH ali@38: } state; ali@38: PloverTransactionHelper *helper; ali@38: }; ali@38: ali@38: /* ali@38: * This handler may be called as either an event (ie., idle or timeout) ali@38: * or as a (swapped) signal. In the latter case, the return is ignored. ali@38: */ ali@38: gboolean set_error_tick(gpointer data) ali@38: { ali@38: struct set_error_baton *baton=data; ali@38: GtkDialog *dlg; ali@38: GtkWidget *button; ali@38: dlg=GTK_DIALOG(baton->helper->error_dialog); ali@38: switch(baton->state) ali@38: { ali@38: case SE_STATE_INIT: ali@38: if (!dlg || !gtk_widget_get_visible(GTK_WIDGET(dlg))) ali@38: return TRUE; ali@38: button=gtk_dialog_get_widget_for_response(dlg,GTK_RESPONSE_CLOSE); ali@38: if (!manual_mode) ali@38: gtk_button_clicked(GTK_BUTTON(button)); ali@38: break; ali@38: case SE_STATE_FINISH: ali@38: if (dlg && gtk_widget_get_visible(GTK_WIDGET(dlg))) ali@38: return TRUE; ali@38: gtk_main_quit(); ali@38: return FALSE; ali@38: } ali@38: baton->state++; ali@38: return TRUE; ali@38: } ali@38: ali@38: static void test_set_error(void) ali@38: { ali@42: gchar *root,*root_uri; ali@38: const char *errmsg; ali@38: GError *err=NULL; ali@38: const GError *err2=NULL; ali@42: GFile *file; ali@38: PloverPackageSet *installed; ali@38: PloverTransactionHelper *helper; ali@38: struct set_error_baton baton={0,}; ali@38: root=g_strdup("razor-test-dir-XXXXXX"); ali@38: g_assert(mkdtemp(root)); ali@42: file=g_file_new_for_path(root); ali@38: g_free(root); ali@42: root_uri=g_file_get_uri(file); ali@42: g_object_unref(file); ali@42: g_setenv("RAZOR_ROOT",root_uri,TRUE); ali@42: g_free(root_uri); ali@38: helper=get_transaction_helper(); ali@38: installed=plover_package_set_new_from_installed("../razor-test-dir",&err); ali@38: if (!installed) ali@38: g_error("../razor-test-dir: %s",err->message); ali@38: plover_transaction_helper_set_installed(helper,installed); ali@38: g_object_unref(installed); ali@38: plover_transaction_helper_set_base(helper,"../yum-repo-test-dir"); ali@38: if (!plover_transaction_helper_update(helper,&err)) ali@38: plover_transaction_helper_set_error(helper,err,"Expected error"); ali@38: g_assert(plover_transaction_helper_get_visible(helper)); ali@38: errmsg=plover_transaction_helper_get_error(helper,&err2); ali@38: g_assert_cmpstr(errmsg,==,"Expected error"); ali@38: g_assert_error(err2,err->domain,err->code); ali@38: plover_transaction_helper_present(helper); ali@38: baton.helper=helper; ali@38: g_idle_add_full(G_PRIORITY_LOW,set_error_tick,&baton,NULL); ali@38: g_error_free(err); ali@38: gtk_main(); ali@38: g_object_unref(helper); ali@38: g_unsetenv("RAZOR_ROOT"); ali@38: } ali@38: ali@38: int main(int argc,char **argv) ali@38: { ali@38: int retval; ali@38: GError *err=NULL; ali@38: /* ali@38: * Note that because g_test_init() handles --help, ali@38: * these options will not appear in the output. ali@38: */ ali@38: GOptionEntry options[]={ ali@38: {"manual",0,0,G_OPTION_ARG_NONE,&manual_mode, ali@38: "Disable automatic mode",NULL}, ali@38: {NULL} ali@38: }; ali@38: g_test_init(&argc,&argv,NULL); ali@38: g_setenv("GTK_MODULES","",TRUE); ali@38: g_setenv("GTK2_RC_FILES","/dev/null",TRUE); ali@38: gtk_disable_setlocale(); ali@38: setlocale(LC_ALL,"C"); ali@38: g_test_bug_base("mailto:ali@juiblex.co.uk"); ali@38: if (!gtk_init_with_args(&argc,&argv,NULL,options,NULL,&err)) ali@38: { ali@38: g_printf("%s\n",err->message); ali@38: exit(0); ali@38: } ali@38: g_test_add_func("/transactionhelper/init",test_init); ali@38: g_test_add_func("/transactionhelper/basic-properties", ali@38: test_basic_properties); ali@38: g_test_add_func("/transactionhelper/install-group",test_install_group); ali@38: g_test_add_func("/transactionhelper/remove-group",test_remove_group); ali@38: g_test_add_func("/transactionhelper/update",test_update); ali@38: g_test_add_func("/transactionhelper/run-install",test_run_install); ali@38: g_test_add_func("/transactionhelper/run-remove",test_run_remove); ali@38: g_test_add_func("/transactionhelper/run-update",test_run_update); ali@38: g_test_add_func("/transactionhelper/check-vendor",test_check_vendor); ali@38: g_test_add_func("/transactionhelper/set-error",test_set_error); ali@38: retval=g_test_run(); ali@38: return retval; ali@38: }