tests/plover-gtk/test-transactionhelper.c
author J. Ali Harlow <ali@juiblex.co.uk>
Sat Jul 16 11:07:18 2016 +0100 (2016-07-16)
changeset 61 31fb35727621
parent 42 419a02fa70db
permissions -rw-r--r--
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.
ali@38
     1
/*
ali@38
     2
 * Copyright (C) 2016  J. Ali Harlow <ali@juiblex.co.uk>
ali@38
     3
 *
ali@38
     4
 * This program is free software; you can redistribute it and/or modify
ali@38
     5
 * it under the terms of the GNU General Public License as published by
ali@38
     6
 * the Free Software Foundation; either version 2 of the License, or
ali@38
     7
 * (at your option) any later version.
ali@38
     8
 *
ali@38
     9
 * This program is distributed in the hope that it will be useful,
ali@38
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
ali@38
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
ali@38
    12
 * GNU General Public License for more details.
ali@38
    13
 *
ali@38
    14
 * You should have received a copy of the GNU General Public License along
ali@38
    15
 * with this program; if not, write to the Free Software Foundation, Inc.,
ali@38
    16
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
ali@38
    17
 */
ali@38
    18
ali@38
    19
#include <stdlib.h>
ali@38
    20
#include <string.h>
ali@38
    21
#include <locale.h>
ali@38
    22
#include <sys/stat.h>
ali@38
    23
#include <glib.h>
ali@38
    24
#include <gdk/gdk.h>
ali@38
    25
#include <gtk/gtk.h>
ali@38
    26
#include <plover/plover.h>
ali@38
    27
#include <plover-gtk/transactionhelper.h>
ali@38
    28
ali@38
    29
GtkBuilder *ui;
ali@38
    30
gboolean manual_mode=FALSE;
ali@38
    31
ali@61
    32
#if 0
ali@61
    33
static void complete_changed(GtkWidget *page,GParamSpec *child_property,
ali@61
    34
  PloverTransactionHelper *helper)
ali@61
    35
{
ali@61
    36
    g_message("complete child property for %s now %s",
ali@61
    37
      gtk_buildable_get_name(GTK_BUILDABLE(page)),
ali@61
    38
      gtk_assistant_get_page_complete(helper->assistant,page)?"TRUE":"FALSE");
ali@61
    39
}
ali@61
    40
#endif
ali@61
    41
ali@38
    42
PloverTransactionHelper *get_transaction_helper(void)
ali@38
    43
{
ali@38
    44
    const char *dir;
ali@38
    45
    gchar *s;
ali@38
    46
    GError *err=NULL;
ali@38
    47
    PloverTransactionHelper *helper;
ali@38
    48
    dir=g_getenv("gtk_srcdir");
ali@38
    49
    s=g_build_filename(dir,"software-installation.ui",NULL);
ali@38
    50
    ui=gtk_builder_new();
ali@38
    51
    if (!gtk_builder_add_from_file(ui,s,&err))
ali@38
    52
	g_error("%s: %s",s,err->message);
ali@38
    53
    g_free(s);
ali@38
    54
    helper=plover_transaction_helper_new(ui);
ali@38
    55
    g_object_unref(ui);
ali@61
    56
#if 0
ali@61
    57
    if (helper->assistant)
ali@61
    58
    {
ali@61
    59
	GtkWidget *page;
ali@61
    60
	int i;
ali@61
    61
	for(i=gtk_assistant_get_n_pages(helper->assistant)-1;i>=0;i--)
ali@61
    62
	{
ali@61
    63
	    page=gtk_assistant_get_nth_page(helper->assistant,i);
ali@61
    64
	    g_signal_connect(page,"child-notify::complete",
ali@61
    65
	      G_CALLBACK(complete_changed),helper);
ali@61
    66
	    g_message("complete child property for %s initially %s",
ali@61
    67
	      gtk_buildable_get_name(GTK_BUILDABLE(page)),
ali@61
    68
	      gtk_assistant_get_page_complete(helper->assistant,page)?
ali@61
    69
	      "TRUE":"FALSE");
ali@61
    70
	}
ali@61
    71
    }
ali@61
    72
#endif
ali@38
    73
    return helper;
ali@38
    74
}
ali@38
    75
ali@38
    76
static void test_init(void)
ali@38
    77
{
ali@38
    78
    PloverTransactionHelper *helper;
ali@38
    79
    helper=get_transaction_helper();
ali@38
    80
    g_object_unref(helper);
ali@38
    81
}
ali@38
    82
ali@38
    83
static void test_basic_properties(void)
ali@38
    84
{
ali@38
    85
    const char *prefix;
ali@61
    86
    char *uri;
ali@61
    87
    gchar *default_prefix;
ali@38
    88
    GError *err=NULL;
ali@38
    89
    struct comps *comps;
ali@38
    90
    PloverTransactionHelper *helper;
ali@38
    91
    PloverPackageSet *installed;
ali@38
    92
    PloverRepository *upstream;
ali@38
    93
    upstream=plover_repository_new_from_yum("../yum-repo-test-dir",&err);
ali@38
    94
    if (!upstream)
ali@38
    95
	g_error("../yum-repo-test-dir: %s",err->message);
ali@61
    96
    uri=razor_path_to_uri("../razor-test-dir");
ali@61
    97
    installed=plover_package_set_new_from_installed(uri,&err);
ali@61
    98
    free(uri);
ali@38
    99
    if (!installed)
ali@38
   100
	g_error("../razor-test-dir: %s",err->message);
ali@38
   101
    helper=get_transaction_helper();
ali@38
   102
    g_assert(!plover_transaction_helper_get_visible(helper));
ali@38
   103
    plover_transaction_helper_set_installed(helper,installed);
ali@38
   104
    g_assert(plover_transaction_helper_get_installed(helper)==installed);
ali@38
   105
    plover_transaction_helper_set_upstream(helper,upstream);
ali@38
   106
    g_assert(plover_transaction_helper_get_upstream(helper,&err)==upstream);
ali@38
   107
    g_assert(!err);
ali@38
   108
    plover_transaction_helper_set_base(helper,"../yum-repo-test-dir");
ali@38
   109
    g_assert_cmpstr(plover_transaction_helper_get_base(helper),==,"../yum-repo-test-dir");
ali@38
   110
    comps=plover_transaction_helper_get_comps(helper,&err);
ali@38
   111
    g_assert(!err);
ali@38
   112
    g_assert(plover_comps_lookup_group(comps,"base"));
ali@38
   113
    prefix=plover_transaction_helper_get_prefix(helper,&err);
ali@38
   114
    g_assert(!err);
ali@61
   115
    comps=plover_comps_new();
ali@61
   116
    plover_comps_set_vendor(comps,"Acme Corporation");
ali@61
   117
    default_prefix=plover_comps_get_default_prefix(comps);
ali@61
   118
    plover_comps_free(comps);
ali@61
   119
    g_assert_cmpstr(prefix,==,default_prefix);
ali@61
   120
    g_free(default_prefix);
ali@38
   121
    g_assert(!plover_transaction_helper_get_visible(helper));
ali@38
   122
    g_assert(!plover_transaction_helper_get_error(helper,NULL));
ali@38
   123
    g_object_unref(upstream);
ali@38
   124
    g_object_unref(installed);
ali@38
   125
    g_object_unref(helper);
ali@38
   126
}
ali@38
   127
ali@38
   128
static void test_install_group(void)
ali@38
   129
{
ali@61
   130
    gchar *root;
ali@38
   131
    GError *err=NULL;
ali@61
   132
    char *uri;
ali@38
   133
    PloverPackageSet *installed;
ali@38
   134
    PloverTransactionHelper *helper;
ali@38
   135
    root=g_strdup("razor-test-dir-XXXXXX");
ali@38
   136
    g_assert(mkdtemp(root));
ali@61
   137
    uri=razor_path_to_uri(root);
ali@38
   138
    g_free(root);
ali@61
   139
    g_setenv("RAZOR_ROOT",uri,TRUE);
ali@61
   140
    free(uri);
ali@38
   141
    helper=get_transaction_helper();
ali@61
   142
    uri=razor_path_to_uri("../razor-test-dir");
ali@61
   143
    installed=plover_package_set_new_from_installed(uri,&err);
ali@61
   144
    free(uri);
ali@38
   145
    if (!installed)
ali@38
   146
	g_error("../razor-test-dir: %s",err->message);
ali@38
   147
    plover_transaction_helper_set_installed(helper,installed);
ali@38
   148
    g_object_unref(installed);
ali@38
   149
    plover_transaction_helper_set_base(helper,"../yum-repo-test-dir");
ali@38
   150
    if (!plover_transaction_helper_install_group(helper,"base",&err))
ali@38
   151
	g_error("base: %s",err->message);
ali@38
   152
    g_assert(!err);
ali@38
   153
    g_object_unref(helper);
ali@38
   154
    g_unsetenv("RAZOR_ROOT");
ali@38
   155
}
ali@38
   156
ali@38
   157
static void test_remove_group(void)
ali@38
   158
{
ali@61
   159
    gchar *root;
ali@61
   160
    char *uri;
ali@38
   161
    GError *err=NULL;
ali@38
   162
    PloverPackageSet *installed;
ali@38
   163
    PloverTransactionHelper *helper;
ali@38
   164
    struct plover_vector *packages;
ali@38
   165
    char *pkgs[]={"zip",NULL};
ali@38
   166
    root=g_strdup("razor-test-dir-XXXXXX");
ali@38
   167
    g_assert(mkdtemp(root));
ali@61
   168
    uri=razor_path_to_uri(root);
ali@61
   169
    g_setenv("RAZOR_ROOT",uri,TRUE);
ali@38
   170
    helper=get_transaction_helper();
ali@38
   171
    plover_transaction_helper_set_base(helper,"../yum-repo-test-dir");
ali@38
   172
    packages=plover_transaction_helper_group_get_default_packages(helper,
ali@38
   173
      "zappy",&err);
ali@38
   174
    if (!packages)
ali@38
   175
	g_error("zappy: %s",err->message);
ali@38
   176
    if (!plover_install("../yum-repo-test-dir",NULL,packages->strings,&err))
ali@38
   177
	g_error("plover_install: %s",err->message);
ali@38
   178
    plover_vector_free(packages);
ali@61
   179
    installed=plover_package_set_new_from_installed(uri,&err);
ali@38
   180
    if (!installed)
ali@38
   181
	g_error("%s: %s",root,err->message);
ali@38
   182
    plover_transaction_helper_set_installed(helper,installed);
ali@38
   183
    g_object_unref(installed);
ali@38
   184
    if (!plover_transaction_helper_remove_group(helper,"zappy",&err))
ali@38
   185
	g_error("zappy: %s",err->message);
ali@38
   186
    g_assert(!err);
ali@38
   187
    g_object_unref(helper);
ali@38
   188
    g_unsetenv("RAZOR_ROOT");
ali@61
   189
    free(uri);
ali@38
   190
    g_free(root);
ali@38
   191
}
ali@38
   192
ali@38
   193
static void test_update(void)
ali@38
   194
{
ali@61
   195
    gchar *root;
ali@61
   196
    char *uri;
ali@38
   197
    GError *err=NULL;
ali@38
   198
    PloverPackageSet *installed;
ali@38
   199
    PloverTransactionHelper *helper;
ali@38
   200
    root=g_strdup("razor-test-dir-XXXXXX");
ali@38
   201
    g_assert(mkdtemp(root));
ali@61
   202
    uri=razor_path_to_uri(root);
ali@61
   203
    g_setenv("RAZOR_ROOT",uri,TRUE);
ali@61
   204
    g_free(uri);
ali@38
   205
    helper=get_transaction_helper();
ali@61
   206
    uri=razor_path_to_uri("../razor-test-dir");
ali@61
   207
    installed=plover_package_set_new_from_installed(uri,&err);
ali@61
   208
    free(uri);
ali@38
   209
    if (!installed)
ali@38
   210
	g_error("../razor-test-dir: %s",err->message);
ali@38
   211
    plover_transaction_helper_set_installed(helper,installed);
ali@38
   212
    g_object_unref(installed);
ali@38
   213
    plover_transaction_helper_set_base(helper,"../yum-repo-test-dir");
ali@38
   214
    if (plover_transaction_helper_update(helper,&err))
ali@38
   215
	g_error("plover_transaction_helper_update reports work to be done");
ali@38
   216
    g_assert_error(err,PLOVER_GENERAL_ERROR,PLOVER_GENERAL_ERROR_NO_WORK);
ali@38
   217
    g_object_unref(helper);
ali@38
   218
    g_unsetenv("RAZOR_ROOT");
ali@38
   219
}
ali@38
   220
ali@38
   221
struct run_install_baton {
ali@38
   222
    enum {
ali@38
   223
	RI_STATE_INIT = 0,
ali@38
   224
	RI_STATE_SUMMARY,
ali@38
   225
	RI_STATE_PROGRESS,
ali@38
   226
	RI_STATE_PROGRESS_DELAY,
ali@38
   227
	RI_STATE_DONE,
ali@38
   228
	RI_STATE_FINISH
ali@38
   229
    } state;
ali@38
   230
    guint eid;		/* event ID (or 0) */
ali@38
   231
    PloverTransactionHelper *helper;
ali@38
   232
};
ali@38
   233
ali@38
   234
gboolean run_install_tick(gpointer data)
ali@38
   235
{
ali@38
   236
    gboolean retval=TRUE;
ali@38
   237
    struct run_install_baton *baton=data;
ali@38
   238
    GtkWidget *page;
ali@38
   239
    GtkAssistant *assistant=baton->helper->assistant;
ali@61
   240
#if 0
ali@61
   241
    page=gtk_assistant_get_nth_page(assistant,
ali@61
   242
      gtk_assistant_get_current_page(assistant));
ali@61
   243
    g_message("run_install_tick: state is %s, on page %s",
ali@61
   244
      baton->state==RI_STATE_INIT?"INIT":
ali@61
   245
      baton->state==RI_STATE_SUMMARY?"SUMMARY":
ali@61
   246
      baton->state==RI_STATE_PROGRESS?"PROGRESS":
ali@61
   247
      baton->state==RI_STATE_PROGRESS_DELAY?"PROGRESS_DELAY":
ali@61
   248
      baton->state==RI_STATE_DONE?"DONE":
ali@61
   249
      baton->state==RI_STATE_FINISH?"FINISH":
ali@61
   250
      "Unknown",
ali@61
   251
      gtk_buildable_get_name(GTK_BUILDABLE(page)));
ali@61
   252
#endif
ali@38
   253
    switch(baton->state)
ali@38
   254
    {
ali@38
   255
	case RI_STATE_INIT:
ali@38
   256
	    if (!assistant || !gtk_widget_get_visible(GTK_WIDGET(assistant)))
ali@38
   257
		return TRUE;
ali@38
   258
	    if (!manual_mode)
ali@38
   259
		gtk_button_clicked(GTK_BUTTON(assistant->forward));
ali@38
   260
	    break;
ali@38
   261
	case RI_STATE_SUMMARY:
ali@38
   262
	    if (gtk_assistant_get_current_page(assistant)<1)
ali@38
   263
		return TRUE;
ali@61
   264
	    g_assert(gtk_widget_is_sensitive(assistant->apply));
ali@38
   265
	    if (!manual_mode)
ali@38
   266
		gtk_button_clicked(GTK_BUTTON(assistant->apply));
ali@38
   267
	    break;
ali@38
   268
	case RI_STATE_PROGRESS:
ali@38
   269
	    if (gtk_assistant_get_current_page(assistant)<2)
ali@38
   270
		return TRUE;
ali@38
   271
	    page=gtk_assistant_get_nth_page(assistant,2);
ali@38
   272
	    baton->eid=g_timeout_add_seconds(1,run_install_tick,baton);
ali@38
   273
	    if (!gtk_assistant_get_page_complete(assistant,page))
ali@38
   274
		return FALSE;
ali@38
   275
	    else
ali@38
   276
		retval=FALSE;
ali@38
   277
	    break;
ali@38
   278
	case RI_STATE_PROGRESS_DELAY:
ali@38
   279
	    retval=FALSE;
ali@38
   280
	    baton->eid=g_idle_add_full(G_PRIORITY_LOW,run_install_tick,baton,
ali@38
   281
	      NULL);
ali@38
   282
	    if (!manual_mode)
ali@38
   283
		gtk_button_clicked(GTK_BUTTON(assistant->forward));
ali@38
   284
	    break;
ali@38
   285
	case RI_STATE_DONE:
ali@38
   286
	    if (gtk_assistant_get_current_page(assistant)<3)
ali@38
   287
		return TRUE;
ali@38
   288
	    if (!manual_mode)
ali@38
   289
		gtk_button_clicked(GTK_BUTTON(assistant->close));
ali@38
   290
	    break;
ali@38
   291
	case RI_STATE_FINISH:
ali@38
   292
	    if (assistant && gtk_widget_get_visible(GTK_WIDGET(assistant)))
ali@38
   293
		return TRUE;
ali@38
   294
	    gtk_main_quit();
ali@38
   295
	    baton->eid=0;
ali@38
   296
	    return FALSE;
ali@38
   297
    }
ali@38
   298
    baton->state++;
ali@38
   299
    return retval;
ali@38
   300
}
ali@38
   301
ali@38
   302
static void test_run_install(void)
ali@38
   303
{
ali@61
   304
    gchar *root;
ali@61
   305
    char *uri;
ali@38
   306
    GError *err=NULL;
ali@38
   307
    struct plover_vector *packages;
ali@38
   308
    PloverPackageSet *installed;
ali@38
   309
    PloverTransactionHelper *helper;
ali@38
   310
    struct run_install_baton baton={0,};
ali@38
   311
    root=g_strdup("razor-test-dir-XXXXXX");
ali@38
   312
    g_assert(mkdtemp(root));
ali@61
   313
    uri=razor_path_to_uri(root);
ali@61
   314
    g_setenv("RAZOR_ROOT",uri,TRUE);
ali@38
   315
    helper=get_transaction_helper();
ali@38
   316
    installed=plover_package_set_new();
ali@61
   317
    if (!plover_package_set_open(installed,uri,TRUE,&err))
ali@38
   318
	g_error("%s: %s",root,err->message);
ali@38
   319
    plover_transaction_helper_set_installed(helper,installed);
ali@38
   320
    g_object_unref(installed);
ali@38
   321
    plover_transaction_helper_set_base(helper,"../yum-repo-test-dir");
ali@38
   322
    packages=plover_vector_new();
ali@38
   323
    plover_vector_append(packages,"zappy-tools");
ali@38
   324
    if (!plover_transaction_helper_install_packages(helper,packages,&err))
ali@38
   325
	g_error("zappy-tools: %s",err->message);
ali@38
   326
    g_assert(!err);
ali@38
   327
    plover_vector_free(packages);
ali@38
   328
    plover_transaction_helper_present(helper);
ali@38
   329
    baton.helper=helper;
ali@38
   330
    baton.eid=g_idle_add_full(G_PRIORITY_LOW,run_install_tick,&baton,NULL);
ali@38
   331
    gtk_main();
ali@38
   332
    g_object_unref(helper);
ali@38
   333
    g_unsetenv("RAZOR_ROOT");
ali@61
   334
    free(uri);
ali@38
   335
    g_free(root);
ali@38
   336
}
ali@38
   337
ali@38
   338
struct run_remove_baton {
ali@38
   339
    enum {
ali@38
   340
	RR_STATE_INIT = 0,
ali@38
   341
	RR_STATE_SUMMARY,
ali@38
   342
	RR_STATE_PROGRESS,
ali@38
   343
	RR_STATE_PROGRESS_DELAY,
ali@38
   344
	RR_STATE_DONE,
ali@38
   345
	RR_STATE_FINISH
ali@38
   346
    } state;
ali@38
   347
    guint eid;		/* event ID (or 0) */
ali@38
   348
    PloverTransactionHelper *helper;
ali@38
   349
};
ali@38
   350
ali@38
   351
gboolean run_remove_tick(gpointer data)
ali@38
   352
{
ali@38
   353
    gboolean retval=TRUE;
ali@38
   354
    struct run_remove_baton *baton=data;
ali@38
   355
    GtkWidget *page;
ali@38
   356
    GtkAssistant *assistant=baton->helper->assistant;
ali@38
   357
    switch(baton->state)
ali@38
   358
    {
ali@38
   359
	case RR_STATE_INIT:
ali@38
   360
	    if (!assistant || !gtk_widget_get_visible(GTK_WIDGET(assistant)))
ali@38
   361
		return TRUE;
ali@38
   362
	    if (!manual_mode)
ali@38
   363
		gtk_button_clicked(GTK_BUTTON(assistant->forward));
ali@38
   364
	    break;
ali@38
   365
	case RR_STATE_SUMMARY:
ali@38
   366
	    if (gtk_assistant_get_current_page(assistant)<1)
ali@38
   367
		return TRUE;
ali@61
   368
	    g_assert(gtk_widget_is_sensitive(assistant->apply));
ali@38
   369
	    if (!manual_mode)
ali@38
   370
		gtk_button_clicked(GTK_BUTTON(assistant->apply));
ali@38
   371
	    break;
ali@38
   372
	case RR_STATE_PROGRESS:
ali@38
   373
	    if (gtk_assistant_get_current_page(assistant)<2)
ali@38
   374
		return TRUE;
ali@38
   375
	    page=gtk_assistant_get_nth_page(assistant,2);
ali@38
   376
	    baton->eid=g_timeout_add_seconds(1,run_remove_tick,baton);
ali@38
   377
	    if (!gtk_assistant_get_page_complete(assistant,page))
ali@38
   378
		return FALSE;
ali@38
   379
	    else
ali@38
   380
		retval=FALSE;
ali@38
   381
	    break;
ali@38
   382
	case RR_STATE_PROGRESS_DELAY:
ali@38
   383
	    retval=FALSE;
ali@38
   384
	    baton->eid=g_idle_add_full(G_PRIORITY_LOW,run_remove_tick,baton,
ali@38
   385
	      NULL);
ali@38
   386
	    if (!manual_mode)
ali@38
   387
		gtk_button_clicked(GTK_BUTTON(assistant->forward));
ali@38
   388
	    break;
ali@38
   389
	case RR_STATE_DONE:
ali@38
   390
	    if (gtk_assistant_get_current_page(assistant)<3)
ali@38
   391
		return TRUE;
ali@38
   392
	    if (!manual_mode)
ali@38
   393
		gtk_button_clicked(GTK_BUTTON(assistant->close));
ali@38
   394
	    break;
ali@38
   395
	case RR_STATE_FINISH:
ali@38
   396
	    if (assistant && gtk_widget_get_visible(GTK_WIDGET(assistant)))
ali@38
   397
		return TRUE;
ali@38
   398
	    gtk_main_quit();
ali@38
   399
	    baton->eid=0;
ali@38
   400
	    return FALSE;
ali@38
   401
    }
ali@38
   402
    baton->state++;
ali@38
   403
    return retval;
ali@38
   404
}
ali@38
   405
ali@38
   406
static void test_run_remove(void)
ali@38
   407
{
ali@61
   408
    gchar *root;
ali@61
   409
    char *uri;
ali@38
   410
    GError *err=NULL;
ali@38
   411
    struct plover_vector *packages;
ali@38
   412
    PloverPackageSet *installed;
ali@38
   413
    PloverTransactionHelper *helper;
ali@38
   414
    struct run_remove_baton baton={0,};
ali@38
   415
    root=g_strdup("razor-test-dir-XXXXXX");
ali@38
   416
    g_assert(mkdtemp(root));
ali@61
   417
    uri=razor_path_to_uri(root);
ali@61
   418
    g_setenv("RAZOR_ROOT",uri,TRUE);
ali@38
   419
    helper=get_transaction_helper();
ali@38
   420
    plover_transaction_helper_set_base(helper,"../yum-repo-test-dir");
ali@38
   421
    packages=
ali@38
   422
      plover_transaction_helper_group_get_default_packages(helper,"zappy",&err);
ali@38
   423
    if (!packages)
ali@38
   424
	g_error("zappy: %s",err->message);
ali@38
   425
    if (!plover_install("../yum-repo-test-dir",NULL,packages->strings,&err))
ali@38
   426
	g_error("plover_install: %s",err->message);
ali@38
   427
    plover_vector_free(packages);
ali@38
   428
    installed=plover_package_set_new();
ali@61
   429
    if (!plover_package_set_open(installed,uri,TRUE,&err))
ali@38
   430
	g_error("%s: %s",root,err->message);
ali@38
   431
    plover_transaction_helper_set_installed(helper,installed);
ali@38
   432
    g_object_unref(installed);
ali@38
   433
    if (!plover_transaction_helper_remove_group(helper,"zappy",&err))
ali@38
   434
	g_error("zappy: %s",err->message);
ali@38
   435
    g_assert(!err);
ali@38
   436
    plover_transaction_helper_present(helper);
ali@38
   437
    baton.helper=helper;
ali@38
   438
    baton.eid=g_idle_add_full(G_PRIORITY_LOW,run_remove_tick,&baton,NULL);
ali@38
   439
    gtk_main();
ali@38
   440
    g_object_unref(helper);
ali@38
   441
    g_unsetenv("RAZOR_ROOT");
ali@61
   442
    free(uri);
ali@38
   443
    g_free(root);
ali@38
   444
}
ali@38
   445
ali@38
   446
struct run_update_baton {
ali@38
   447
    enum {
ali@38
   448
	RU_STATE_INIT = 0,
ali@38
   449
	RU_STATE_SUMMARY,
ali@38
   450
	RU_STATE_PROGRESS,
ali@38
   451
	RU_STATE_PROGRESS_DELAY,
ali@38
   452
	RU_STATE_DONE,
ali@38
   453
	RU_STATE_FINISH
ali@38
   454
    } state;
ali@38
   455
    guint eid;		/* event ID (or 0) */
ali@38
   456
    PloverTransactionHelper *helper;
ali@38
   457
};
ali@38
   458
ali@38
   459
gboolean run_update_tick(gpointer data)
ali@38
   460
{
ali@38
   461
    gboolean retval=TRUE;
ali@38
   462
    struct run_update_baton *baton=data;
ali@38
   463
    GtkWidget *page;
ali@38
   464
    GtkAssistant *assistant=baton->helper->assistant;
ali@38
   465
    switch(baton->state)
ali@38
   466
    {
ali@38
   467
	case RU_STATE_INIT:
ali@38
   468
	    if (!assistant || !gtk_widget_get_visible(GTK_WIDGET(assistant)))
ali@38
   469
		return TRUE;
ali@38
   470
	    if (!manual_mode)
ali@38
   471
		gtk_button_clicked(GTK_BUTTON(assistant->forward));
ali@38
   472
	    break;
ali@38
   473
	case RU_STATE_SUMMARY:
ali@38
   474
	    if (gtk_assistant_get_current_page(assistant)<1)
ali@38
   475
		return TRUE;
ali@61
   476
	    g_assert(gtk_widget_is_sensitive(assistant->apply));
ali@38
   477
	    if (!manual_mode)
ali@38
   478
		gtk_button_clicked(GTK_BUTTON(assistant->apply));
ali@38
   479
	    break;
ali@38
   480
	case RU_STATE_PROGRESS:
ali@38
   481
	    if (gtk_assistant_get_current_page(assistant)<2)
ali@38
   482
		return TRUE;
ali@38
   483
	    page=gtk_assistant_get_nth_page(assistant,2);
ali@38
   484
	    baton->eid=g_timeout_add_seconds(1,run_update_tick,baton);
ali@38
   485
	    if (!gtk_assistant_get_page_complete(assistant,page))
ali@38
   486
		return FALSE;
ali@38
   487
	    else
ali@38
   488
		retval=FALSE;
ali@38
   489
	    break;
ali@38
   490
	case RU_STATE_PROGRESS_DELAY:
ali@38
   491
	    retval=FALSE;
ali@38
   492
	    baton->eid=g_idle_add_full(G_PRIORITY_LOW,run_update_tick,baton,
ali@38
   493
	      NULL);
ali@38
   494
	    if (!manual_mode)
ali@38
   495
		gtk_button_clicked(GTK_BUTTON(assistant->forward));
ali@38
   496
	    break;
ali@38
   497
	case RU_STATE_DONE:
ali@38
   498
	    if (gtk_assistant_get_current_page(assistant)<3)
ali@38
   499
		return TRUE;
ali@38
   500
	    if (!manual_mode)
ali@38
   501
		gtk_button_clicked(GTK_BUTTON(assistant->close));
ali@38
   502
	    break;
ali@38
   503
	case RU_STATE_FINISH:
ali@38
   504
	    if (assistant && gtk_widget_get_visible(GTK_WIDGET(assistant)))
ali@38
   505
		return TRUE;
ali@38
   506
	    gtk_main_quit();
ali@38
   507
	    baton->eid=0;
ali@38
   508
	    return FALSE;
ali@38
   509
    }
ali@38
   510
    baton->state++;
ali@38
   511
    return retval;
ali@38
   512
}
ali@38
   513
ali@38
   514
static void test_run_update(void)
ali@38
   515
{
ali@61
   516
    gchar *root;
ali@61
   517
    char *uri;
ali@38
   518
    GError *err=NULL;
ali@38
   519
    struct razor_importer *importer;
ali@38
   520
    struct razor_set *downgraded;
ali@38
   521
    struct razor_atomic *atomic;
ali@38
   522
    struct plover_vector *packages;
ali@38
   523
    PloverPackageSet *installed;
ali@38
   524
    PloverTransactionHelper *helper;
ali@38
   525
    struct run_update_baton baton={0,};
ali@38
   526
    root=g_strdup("razor-test-dir-XXXXXX");
ali@38
   527
    g_assert(mkdtemp(root));
ali@61
   528
    uri=razor_path_to_uri(root);
ali@61
   529
    g_setenv("RAZOR_ROOT",uri,TRUE);
ali@38
   530
    helper=get_transaction_helper();
ali@38
   531
    plover_transaction_helper_set_base(helper,"../yum-repo-test-dir");
ali@38
   532
    installed=plover_package_set_new();
ali@61
   533
    if (!plover_package_set_open(installed,uri,TRUE,&err))
ali@38
   534
	g_error("%s: %s",root,err->message);
ali@38
   535
    importer=razor_importer_create();
ali@38
   536
    razor_importer_begin_package(importer,"zappy","0-1","noarch");
ali@38
   537
    razor_importer_add_details(importer,"","","","");
ali@38
   538
    razor_importer_add_property(importer,"zappy",RAZOR_PROPERTY_PROVIDES,"0-1");
ali@38
   539
    razor_importer_finish_package(importer);
ali@38
   540
    downgraded=razor_importer_finish(importer);
ali@38
   541
    atomic=razor_atomic_open("Add downgraded packages");
ali@38
   542
    if (!plover_package_set_update(installed,downgraded,atomic) ||
ali@38
   543
      razor_atomic_commit(atomic))
ali@38
   544
	g_error("%s: %s",root,razor_atomic_get_error_msg(atomic));
ali@38
   545
    razor_atomic_destroy(atomic);
ali@38
   546
    razor_set_unref(downgraded);
ali@38
   547
    plover_transaction_helper_set_installed(helper,installed);
ali@38
   548
    g_object_unref(installed);
ali@38
   549
    if (!plover_transaction_helper_update(helper,&err))
ali@38
   550
	g_error("update: %s",err->message);
ali@38
   551
    g_assert(!err);
ali@38
   552
    plover_transaction_helper_present(helper);
ali@38
   553
    baton.helper=helper;
ali@38
   554
    baton.eid=g_idle_add_full(G_PRIORITY_LOW,run_update_tick,&baton,NULL);
ali@38
   555
    gtk_main();
ali@38
   556
    g_object_unref(helper);
ali@38
   557
    g_unsetenv("RAZOR_ROOT");
ali@61
   558
    free(uri);
ali@38
   559
    g_free(root);
ali@38
   560
}
ali@38
   561
ali@38
   562
struct check_vendor_baton {
ali@38
   563
    enum {
ali@38
   564
	CV_STATE_INIT = 0,
ali@38
   565
	CV_STATE_SUMMARY,
ali@38
   566
	CV_STATE_PROGRESS,
ali@38
   567
	CV_STATE_PROGRESS_DELAY,
ali@38
   568
	CV_STATE_DONE,
ali@38
   569
	CV_STATE_FINISH
ali@38
   570
    } state;
ali@38
   571
    guint eid;		/* event ID (or 0) */
ali@38
   572
    PloverTransactionHelper *helper;
ali@38
   573
};
ali@38
   574
ali@38
   575
gboolean check_vendor_tick(gpointer data)
ali@38
   576
{
ali@38
   577
    gboolean retval=TRUE;
ali@38
   578
    struct check_vendor_baton *baton=data;
ali@38
   579
    GtkWidget *page,*w;
ali@38
   580
    GtkAssistant *assistant=baton->helper->assistant;
ali@38
   581
    switch(baton->state)
ali@38
   582
    {
ali@38
   583
	case CV_STATE_INIT:
ali@38
   584
	    if (!assistant || !gtk_widget_get_visible(GTK_WIDGET(assistant)))
ali@38
   585
		return TRUE;
ali@38
   586
	    if (!manual_mode)
ali@38
   587
		gtk_button_clicked(GTK_BUTTON(assistant->forward));
ali@38
   588
	    break;
ali@38
   589
	case CV_STATE_SUMMARY:
ali@38
   590
	    if (gtk_assistant_get_current_page(assistant)<1)
ali@38
   591
		return TRUE;
ali@38
   592
	    g_assert(!gtk_widget_is_sensitive(assistant->apply));
ali@38
   593
	    w=GTK_WIDGET(gtk_builder_get_object(ui,"SIRemoveExisting"));
ali@38
   594
	    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w),TRUE);
ali@38
   595
	    g_assert(gtk_widget_is_sensitive(assistant->apply));
ali@38
   596
	    if (!manual_mode)
ali@38
   597
		gtk_button_clicked(GTK_BUTTON(assistant->apply));
ali@38
   598
	    break;
ali@38
   599
	case CV_STATE_PROGRESS:
ali@38
   600
	    if (gtk_assistant_get_current_page(assistant)<2)
ali@38
   601
		return TRUE;
ali@38
   602
	    page=gtk_assistant_get_nth_page(assistant,2);
ali@38
   603
	    baton->eid=g_timeout_add_seconds(1,check_vendor_tick,baton);
ali@38
   604
	    if (!gtk_assistant_get_page_complete(assistant,page))
ali@38
   605
		return FALSE;
ali@38
   606
	    else
ali@38
   607
		retval=FALSE;
ali@38
   608
	    break;
ali@38
   609
	case CV_STATE_PROGRESS_DELAY:
ali@38
   610
	    retval=FALSE;
ali@38
   611
	    baton->eid=g_idle_add_full(G_PRIORITY_LOW,check_vendor_tick,baton,
ali@38
   612
	      NULL);
ali@38
   613
	    if (!manual_mode)
ali@38
   614
		gtk_button_clicked(GTK_BUTTON(assistant->forward));
ali@38
   615
	    break;
ali@38
   616
	case CV_STATE_DONE:
ali@38
   617
	    if (gtk_assistant_get_current_page(assistant)<3)
ali@38
   618
		return TRUE;
ali@38
   619
	    if (!manual_mode)
ali@38
   620
		gtk_button_clicked(GTK_BUTTON(assistant->close));
ali@38
   621
	    break;
ali@38
   622
	case CV_STATE_FINISH:
ali@38
   623
	    if (assistant && gtk_widget_get_visible(GTK_WIDGET(assistant)))
ali@38
   624
		return TRUE;
ali@38
   625
	    gtk_main_quit();
ali@38
   626
	    baton->eid=0;
ali@38
   627
	    return FALSE;
ali@38
   628
    }
ali@38
   629
    baton->state++;
ali@38
   630
    return retval;
ali@38
   631
}
ali@38
   632
ali@38
   633
static void test_check_vendor(void)
ali@38
   634
{
ali@38
   635
    int fh;
ali@61
   636
    gchar *root,*s;
ali@61
   637
    char *uri;
ali@38
   638
    GError *err=NULL;
ali@38
   639
    struct razor_importer *importer;
ali@38
   640
    struct razor_set *downgraded;
ali@38
   641
    struct razor_atomic *atomic;
ali@38
   642
    struct plover_vector *packages;
ali@38
   643
    PloverPackageSet *installed;
ali@38
   644
    PloverTransactionHelper *helper;
ali@61
   645
    struct check_vendor_baton baton={0,};
ali@38
   646
    g_setenv("PLOVER_VENDOR_PREFIX","/srv",TRUE);
ali@38
   647
    root=g_strdup("razor-test-dir-XXXXXX");
ali@38
   648
    g_assert(mkdtemp(root));
ali@61
   649
    uri=razor_path_to_uri(root);
ali@61
   650
    g_setenv("RAZOR_ROOT",uri,TRUE);
ali@38
   651
    helper=get_transaction_helper();
ali@38
   652
    plover_transaction_helper_set_check_vendor(helper,TRUE);
ali@38
   653
    plover_transaction_helper_set_base(helper,"../yum-repo-test-dir");
ali@38
   654
    installed=plover_package_set_new();
ali@61
   655
    if (!plover_package_set_open(installed,uri,TRUE,&err))
ali@38
   656
	g_error("%s: %s",root,err->message);
ali@38
   657
    importer=razor_importer_create();
ali@38
   658
    razor_importer_begin_package(importer,"zappy","0-1","noarch");
ali@38
   659
    razor_importer_add_details(importer,"","","","");
ali@38
   660
    razor_importer_add_property(importer,"zappy",RAZOR_PROPERTY_PROVIDES,"0-1");
ali@38
   661
    razor_importer_add_install_prefix(importer,"/test");
ali@38
   662
    razor_importer_add_file(importer,"/test/bin/zappy");
ali@38
   663
    razor_importer_finish_package(importer);
ali@38
   664
    downgraded=razor_importer_finish(importer);
ali@38
   665
    atomic=razor_atomic_open("Add downgraded packages");
ali@61
   666
    razor_atomic_make_dirs(atomic,uri,"/test/bin/zappy");
ali@61
   667
    s=g_build_filename(uri,"test/bin/zappy",NULL);
ali@38
   668
    fh=razor_atomic_create_file(atomic,s,S_IRWXU|S_IRWXG|S_IRWXO);
ali@38
   669
    g_free(s);
ali@38
   670
    razor_atomic_close(atomic,fh);
ali@38
   671
    if (!plover_package_set_update(installed,downgraded,atomic) ||
ali@38
   672
      razor_atomic_commit(atomic))
ali@38
   673
	g_error("%s: %s",root,razor_atomic_get_error_msg(atomic));
ali@38
   674
    razor_atomic_destroy(atomic);
ali@38
   675
    razor_set_unref(downgraded);
ali@38
   676
    plover_transaction_helper_set_installed(helper,installed);
ali@38
   677
    g_object_unref(installed);
ali@38
   678
    if (!plover_transaction_helper_update(helper,&err))
ali@38
   679
	g_error("update: %s",err->message);
ali@38
   680
    g_assert(!err);
ali@38
   681
    plover_transaction_helper_present(helper);
ali@38
   682
    baton.helper=helper;
ali@38
   683
    baton.eid=g_idle_add_full(G_PRIORITY_LOW,check_vendor_tick,&baton,NULL);
ali@38
   684
    gtk_main();
ali@38
   685
    g_object_unref(helper);
ali@38
   686
    g_unsetenv("RAZOR_ROOT");
ali@38
   687
    g_free(root);
ali@61
   688
    free(uri);
ali@38
   689
    g_unsetenv("PLOVER_VENDOR_PREFIX");
ali@38
   690
}
ali@38
   691
ali@61
   692
static gchar *create_new_root_and_install(gchar **prefix_p,char **pkgs)
ali@61
   693
{
ali@61
   694
    gchar *root,*prefix;
ali@61
   695
    char *uri;
ali@61
   696
    GError *err=NULL;
ali@61
   697
    struct comps *comps;
ali@61
   698
    PloverTransaction *transaction;
ali@61
   699
    root=g_strdup("razor-test-dir-XXXXXX");
ali@61
   700
    g_assert(mkdtemp(root));
ali@61
   701
    uri=razor_path_to_uri(root);
ali@61
   702
    g_setenv("RAZOR_ROOT",uri,TRUE);
ali@61
   703
    free(uri);
ali@61
   704
    uri=razor_path_to_uri("../yum-repo-test-dir/repodata/comps.xml");
ali@61
   705
    comps=plover_comps_new_from_uri(uri,&err);
ali@61
   706
    free(uri);
ali@61
   707
    if (!comps)
ali@61
   708
	g_error("../yum-repo-test-dir/repodata/comps.xml: %s",err->message);
ali@61
   709
    prefix=plover_comps_get_default_prefix(comps);
ali@61
   710
    plover_comps_free(comps);
ali@61
   711
    transaction=plover_transaction_new_install("../yum-repo-test-dir",prefix,
ali@61
   712
      pkgs,&err);
ali@61
   713
    if (!transaction)
ali@61
   714
	g_error("../yum-repo-test-dir: %s",err->message);
ali@61
   715
    g_assert(plover_transaction_commit(transaction,NULL,NULL));
ali@61
   716
    g_object_unref(transaction);
ali@61
   717
    fflush(stdout);
ali@61
   718
    if (prefix_p)
ali@61
   719
	*prefix_p=prefix;
ali@61
   720
    else
ali@61
   721
	g_free(prefix);
ali@61
   722
    return root;
ali@61
   723
}
ali@61
   724
ali@61
   725
static check_file(const char *root,const char *path)
ali@61
   726
{
ali@61
   727
    gchar *s;
ali@61
   728
    s=g_build_filename(root,path,NULL);
ali@61
   729
    g_assert(g_file_test(s,G_FILE_TEST_EXISTS));
ali@61
   730
    g_free(s);
ali@61
   731
}
ali@61
   732
ali@61
   733
static check_no_file(const char *root,const char *path)
ali@61
   734
{
ali@61
   735
    gchar *s;
ali@61
   736
    s=g_build_filename(root,path,NULL);
ali@61
   737
    g_assert(!g_file_test(s,G_FILE_TEST_EXISTS));
ali@61
   738
    g_free(s);
ali@61
   739
}
ali@61
   740
ali@61
   741
/*
ali@61
   742
 * Test that installing from a repository which is marked as distribution-local
ali@61
   743
 * on top of an existing global installation works if prefix is NULL
ali@61
   744
 * (which is the case on UNIX if PLOVER_VENDOR_PREFIX is not set).
ali@61
   745
 */
ali@61
   746
static void test_unprefixed_distribution_local(void)
ali@61
   747
{
ali@61
   748
    gchar *root;
ali@61
   749
    GError *err=NULL;
ali@61
   750
    char *pkgs[]={"zap",NULL};
ali@61
   751
    struct plover_vector *packages;
ali@61
   752
    PloverPackageSet *installed;
ali@61
   753
    PloverTransactionHelper *helper;
ali@61
   754
    struct run_install_baton baton={0,};
ali@61
   755
    g_unsetenv("PLOVER_VENDOR_PREFIX");
ali@61
   756
    root=create_new_root_and_install(NULL,pkgs);
ali@61
   757
    check_file(root,"/usr/bin/zap");
ali@61
   758
    helper=get_transaction_helper();
ali@61
   759
    plover_transaction_helper_set_check_vendor(helper,TRUE);
ali@61
   760
    plover_transaction_helper_set_base(helper,"../distribution-local-test-dir");
ali@61
   761
    packages=plover_vector_new();
ali@61
   762
    plover_vector_append(packages,"zappy");
ali@61
   763
    if (!plover_transaction_helper_install_packages(helper,packages,&err))
ali@61
   764
	g_error("zappy: %s",err->message);
ali@61
   765
    g_assert(!err);
ali@61
   766
    plover_vector_free(packages);
ali@61
   767
    plover_transaction_helper_present(helper);
ali@61
   768
    baton.helper=helper;
ali@61
   769
    baton.eid=g_idle_add_full(G_PRIORITY_LOW,run_install_tick,&baton,NULL);
ali@61
   770
    gtk_main();
ali@61
   771
    g_object_unref(helper);
ali@61
   772
    check_file(root,"/usr/bin/zappy");
ali@61
   773
    g_free(root);
ali@61
   774
    g_unsetenv("RAZOR_ROOT");
ali@61
   775
}
ali@61
   776
ali@61
   777
/*
ali@61
   778
 * Test that installing from a repository which is marked as distribution-local
ali@61
   779
 * on top of an existing global installation requires removing the existing
ali@61
   780
 * installation if prefix is non-NULL (which is the case if PLOVER_VENDOR_PREFIX
ali@61
   781
 * is set).
ali@61
   782
 */
ali@61
   783
static void test_prefixed_distribution_local(void)
ali@61
   784
{
ali@61
   785
    gchar *root,*s;
ali@61
   786
    gchar *prefix;
ali@61
   787
    GError *err=NULL;
ali@61
   788
    char *pkgs[]={"zap",NULL};
ali@61
   789
    struct plover_vector *packages;
ali@61
   790
    PloverPackageSet *installed;
ali@61
   791
    PloverTransactionHelper *helper;
ali@61
   792
    struct check_vendor_baton baton={0,};
ali@61
   793
    g_setenv("PLOVER_VENDOR_PREFIX","/srv",TRUE);
ali@61
   794
    helper=get_transaction_helper();
ali@61
   795
    plover_transaction_helper_set_check_vendor(helper,TRUE);
ali@61
   796
    plover_transaction_helper_set_base(helper,"../distribution-local-test-dir");
ali@61
   797
    root=create_new_root_and_install(&prefix,pkgs);
ali@61
   798
    s=g_build_filename(prefix,"bin/zap",NULL);
ali@61
   799
    check_file(root,s);
ali@61
   800
    g_free(s);
ali@61
   801
    packages=plover_vector_new();
ali@61
   802
    plover_vector_append(packages,"filesystem");
ali@61
   803
    if (!plover_transaction_helper_install_packages(helper,packages,&err))
ali@61
   804
	g_error("filesystem: %s",err->message);
ali@61
   805
    g_assert(!err);
ali@61
   806
    plover_vector_free(packages);
ali@61
   807
    plover_transaction_helper_present(helper);
ali@61
   808
    baton.helper=helper;
ali@61
   809
    baton.eid=g_idle_add_full(G_PRIORITY_LOW,check_vendor_tick,&baton,NULL);
ali@61
   810
    gtk_main();
ali@61
   811
    g_object_unref(helper);
ali@61
   812
    s=g_build_filename(prefix,"bin/zap",NULL);
ali@61
   813
    check_no_file(root,s);
ali@61
   814
    g_free(s);
ali@61
   815
    check_no_file(root,"/media");
ali@61
   816
    g_free(root);
ali@61
   817
    g_free(prefix);
ali@61
   818
    g_unsetenv("RAZOR_ROOT");
ali@61
   819
}
ali@61
   820
ali@38
   821
struct set_error_baton {
ali@38
   822
    enum {
ali@38
   823
	SE_STATE_INIT = 0,
ali@38
   824
	SE_STATE_FINISH
ali@38
   825
    } state;
ali@38
   826
    PloverTransactionHelper *helper;
ali@38
   827
};
ali@38
   828
ali@38
   829
/*
ali@38
   830
 * This handler may be called as either an event (ie., idle or timeout)
ali@38
   831
 * or as a (swapped) signal. In the latter case, the return is ignored.
ali@38
   832
 */
ali@38
   833
gboolean set_error_tick(gpointer data)
ali@38
   834
{
ali@38
   835
    struct set_error_baton *baton=data;
ali@38
   836
    GtkDialog *dlg;
ali@38
   837
    GtkWidget *button;
ali@38
   838
    dlg=GTK_DIALOG(baton->helper->error_dialog);
ali@38
   839
    switch(baton->state)
ali@38
   840
    {
ali@38
   841
	case SE_STATE_INIT:
ali@38
   842
	    if (!dlg || !gtk_widget_get_visible(GTK_WIDGET(dlg)))
ali@38
   843
		return TRUE;
ali@38
   844
	    button=gtk_dialog_get_widget_for_response(dlg,GTK_RESPONSE_CLOSE);
ali@38
   845
	    if (!manual_mode)
ali@38
   846
		gtk_button_clicked(GTK_BUTTON(button));
ali@38
   847
	    break;
ali@38
   848
	case SE_STATE_FINISH:
ali@38
   849
	    if (dlg && gtk_widget_get_visible(GTK_WIDGET(dlg)))
ali@38
   850
		return TRUE;
ali@38
   851
	    gtk_main_quit();
ali@38
   852
	    return FALSE;
ali@38
   853
    }
ali@38
   854
    baton->state++;
ali@38
   855
    return TRUE;
ali@38
   856
}
ali@38
   857
ali@38
   858
static void test_set_error(void)
ali@38
   859
{
ali@61
   860
    gchar *root;
ali@61
   861
    char *uri;
ali@38
   862
    const char *errmsg;
ali@38
   863
    GError *err=NULL;
ali@38
   864
    const GError *err2=NULL;
ali@38
   865
    PloverPackageSet *installed;
ali@38
   866
    PloverTransactionHelper *helper;
ali@38
   867
    struct set_error_baton baton={0,};
ali@38
   868
    root=g_strdup("razor-test-dir-XXXXXX");
ali@38
   869
    g_assert(mkdtemp(root));
ali@61
   870
    uri=razor_path_to_uri(root);
ali@38
   871
    g_free(root);
ali@61
   872
    g_setenv("RAZOR_ROOT",uri,TRUE);
ali@61
   873
    free(uri);
ali@38
   874
    helper=get_transaction_helper();
ali@61
   875
    uri=razor_path_to_uri("../razor-test-dir");
ali@61
   876
    installed=plover_package_set_new_from_installed(uri,&err);
ali@61
   877
    free(uri);
ali@38
   878
    if (!installed)
ali@38
   879
	g_error("../razor-test-dir: %s",err->message);
ali@38
   880
    plover_transaction_helper_set_installed(helper,installed);
ali@38
   881
    g_object_unref(installed);
ali@38
   882
    plover_transaction_helper_set_base(helper,"../yum-repo-test-dir");
ali@38
   883
    if (!plover_transaction_helper_update(helper,&err))
ali@38
   884
	plover_transaction_helper_set_error(helper,err,"Expected error");
ali@38
   885
    g_assert(plover_transaction_helper_get_visible(helper));
ali@38
   886
    errmsg=plover_transaction_helper_get_error(helper,&err2);
ali@38
   887
    g_assert_cmpstr(errmsg,==,"Expected error");
ali@38
   888
    g_assert_error(err2,err->domain,err->code);
ali@38
   889
    plover_transaction_helper_present(helper);
ali@38
   890
    baton.helper=helper;
ali@38
   891
    g_idle_add_full(G_PRIORITY_LOW,set_error_tick,&baton,NULL);
ali@38
   892
    g_error_free(err);
ali@38
   893
    gtk_main();
ali@38
   894
    g_object_unref(helper);
ali@38
   895
    g_unsetenv("RAZOR_ROOT");
ali@38
   896
}
ali@38
   897
ali@38
   898
int main(int argc,char **argv)
ali@38
   899
{
ali@38
   900
    int retval;
ali@38
   901
    GError *err=NULL;
ali@38
   902
    /*
ali@38
   903
     * Note that because g_test_init() handles --help,
ali@38
   904
     * these options will not appear in the output.
ali@38
   905
     */
ali@38
   906
    GOptionEntry options[]={
ali@38
   907
	{"manual",0,0,G_OPTION_ARG_NONE,&manual_mode,
ali@38
   908
	  "Disable automatic mode",NULL},
ali@38
   909
	{NULL}
ali@38
   910
    };
ali@38
   911
    g_test_init(&argc,&argv,NULL);
ali@38
   912
    g_setenv("GTK_MODULES","",TRUE);
ali@38
   913
    g_setenv("GTK2_RC_FILES","/dev/null",TRUE);
ali@38
   914
    gtk_disable_setlocale();
ali@38
   915
    setlocale(LC_ALL,"C");
ali@38
   916
    g_test_bug_base("mailto:ali@juiblex.co.uk");
ali@38
   917
    if (!gtk_init_with_args(&argc,&argv,NULL,options,NULL,&err))
ali@38
   918
    {
ali@38
   919
	g_printf("%s\n",err->message);
ali@38
   920
	exit(0);
ali@38
   921
    }
ali@38
   922
    g_test_add_func("/transactionhelper/init",test_init);
ali@38
   923
    g_test_add_func("/transactionhelper/basic-properties",
ali@38
   924
      test_basic_properties);
ali@38
   925
    g_test_add_func("/transactionhelper/install-group",test_install_group);
ali@38
   926
    g_test_add_func("/transactionhelper/remove-group",test_remove_group);
ali@38
   927
    g_test_add_func("/transactionhelper/update",test_update);
ali@38
   928
    g_test_add_func("/transactionhelper/run-install",test_run_install);
ali@38
   929
    g_test_add_func("/transactionhelper/run-remove",test_run_remove);
ali@38
   930
    g_test_add_func("/transactionhelper/run-update",test_run_update);
ali@38
   931
    g_test_add_func("/transactionhelper/check-vendor",test_check_vendor);
ali@61
   932
    g_test_add_func("/transactionhelper/unprefixed-distribution-local",
ali@61
   933
      test_unprefixed_distribution_local);
ali@61
   934
    g_test_add_func("/transactionhelper/prefixed-distribution-local",
ali@61
   935
      test_prefixed_distribution_local);
ali@38
   936
    g_test_add_func("/transactionhelper/set-error",test_set_error);
ali@38
   937
    retval=g_test_run();
ali@38
   938
    return retval;
ali@38
   939
}