tests/plover/test-package.c
author J. Ali Harlow <ali@juiblex.co.uk>
Tue Apr 24 18:49:55 2018 +0100 (2018-04-24)
changeset 67 c9eb7aa21ff4
parent 44 43ffed8669ce
permissions -rw-r--r--
Release 0.5.3
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 <razor.h>
ali@38
    21
#include <plover/plover.h>
ali@38
    22
#include <plover/package.h>
ali@38
    23
ali@38
    24
struct razor_set *test_set=NULL;
ali@38
    25
struct razor_package *test_pkg=NULL;
ali@38
    26
ali@38
    27
static void finalize(void)
ali@38
    28
{
ali@38
    29
    if (test_set)
ali@38
    30
	razor_set_unref(test_set);
ali@38
    31
}
ali@38
    32
ali@38
    33
void import_properties(struct razor_importer *importer,
ali@38
    34
  struct razor_set *set,struct razor_package *pkg)
ali@38
    35
{
ali@38
    36
    struct razor_property_iterator *iter;
ali@38
    37
    struct razor_property *prop;
ali@38
    38
    uint32_t flags;
ali@38
    39
    const char *name,*version;
ali@38
    40
    iter=razor_property_iterator_create(set,pkg);
ali@38
    41
    while(razor_property_iterator_next(iter,&prop,&name,&flags,&version))
ali@38
    42
	razor_importer_add_property(importer,name,flags,version);
ali@38
    43
    razor_property_iterator_destroy(iter);
ali@38
    44
}
ali@38
    45
ali@38
    46
void import_files(struct razor_importer *importer,
ali@38
    47
  struct razor_set *set,struct razor_package *pkg)
ali@38
    48
{
ali@38
    49
    struct razor_file_iterator *iter;
ali@38
    50
    const char *name;
ali@38
    51
    iter=razor_file_iterator_create(set,pkg,FALSE);
ali@38
    52
    while(razor_file_iterator_next(iter,&name))
ali@38
    53
	razor_importer_add_file(importer,name);
ali@38
    54
    razor_file_iterator_destroy(iter);
ali@38
    55
}
ali@38
    56
ali@38
    57
gboolean import_rpm(struct razor_rpm *rpm)
ali@38
    58
{
ali@38
    59
    int i;
ali@38
    60
    struct razor_importer *importer;
ali@38
    61
    struct razor_package_iterator *iter;
ali@38
    62
    struct razor_set *set;
ali@38
    63
    struct razor_package *pkg=NULL;
ali@38
    64
    const char *name,*version,*arch,*summary,*description,*url,*license;
ali@38
    65
    const char *s,*pkg_name;
ali@38
    66
    const char *const *prefixes;
ali@38
    67
    /*
ali@38
    68
     * First pass: get a razor_set and razor_package with everything
ali@38
    69
     * except the prefixes.
ali@38
    70
     */
ali@38
    71
    importer=razor_importer_create();
ali@38
    72
    if (razor_importer_add_rpm(importer,rpm))
ali@38
    73
	g_error("../yum-repo-test-dir: Failed to add rpm");
ali@38
    74
    set=razor_importer_finish(importer);
ali@38
    75
    if (!set)
ali@38
    76
	g_error("../yum-repo-test-dir: Failed to import");
ali@38
    77
    iter=razor_package_iterator_create(set);
ali@38
    78
    pkg=NULL;
ali@38
    79
    razor_rpm_get_details(rpm,RAZOR_DETAIL_NAME,&pkg_name,RAZOR_DETAIL_LAST);
ali@38
    80
    while(razor_package_iterator_next(iter,&pkg,RAZOR_DETAIL_NAME,&s,
ali@38
    81
      RAZOR_DETAIL_LAST))
ali@38
    82
	if (!strcmp(s,pkg_name))
ali@38
    83
	    break;
ali@38
    84
    razor_package_iterator_destroy(iter);
ali@38
    85
    if (!pkg)
ali@38
    86
    {
ali@38
    87
	razor_set_unref(set);
ali@38
    88
	return FALSE;
ali@38
    89
    }
ali@38
    90
    /*
ali@38
    91
     * Second pass: use the information from the first pass plus the
ali@38
    92
     * prefixes to create a final razor_set and razor_package.
ali@38
    93
     */
ali@38
    94
    importer=razor_importer_create();
ali@38
    95
    razor_package_get_details(set,pkg,RAZOR_DETAIL_NAME,&name,
ali@38
    96
      RAZOR_DETAIL_VERSION,&version,RAZOR_DETAIL_ARCH,&arch,
ali@38
    97
      RAZOR_DETAIL_SUMMARY,&summary,RAZOR_DETAIL_DESCRIPTION,&description,
ali@38
    98
      RAZOR_DETAIL_URL,&url,RAZOR_DETAIL_LICENSE,&license,RAZOR_DETAIL_LAST);
ali@38
    99
    razor_importer_begin_package(importer,name,version,arch);
ali@38
   100
    razor_importer_add_details(importer,summary,description,url,license);
ali@38
   101
    import_properties(importer,set,pkg);
ali@38
   102
    import_files(importer,set,pkg);
ali@38
   103
    razor_rpm_get_details(rpm,RAZOR_DETAIL_PREFIXES,&prefixes,
ali@38
   104
      RAZOR_DETAIL_LAST);
ali@38
   105
    for(i=0;prefixes && prefixes[i];i++)
ali@38
   106
	razor_importer_add_install_prefix(importer,prefixes[i]);
ali@38
   107
    razor_importer_finish_package(importer);
ali@38
   108
    razor_set_unref(set);
ali@38
   109
    test_set=razor_importer_finish(importer);
ali@38
   110
    g_assert(test_set != NULL);
ali@38
   111
    iter=razor_package_iterator_create(test_set);
ali@38
   112
    test_pkg=NULL;
ali@38
   113
    while(razor_package_iterator_next(iter,&test_pkg,RAZOR_DETAIL_NAME,&s,
ali@38
   114
      RAZOR_DETAIL_LAST))
ali@38
   115
	if (!strcmp(s,pkg_name))
ali@38
   116
	    break;
ali@38
   117
    razor_package_iterator_destroy(iter);
ali@38
   118
    return !!test_pkg;
ali@38
   119
}
ali@38
   120
ali@38
   121
static PloverPackage *package_getref(const char *name,const char *version)
ali@38
   122
{
ali@38
   123
    struct razor_rpm *rpm;
ali@38
   124
    PloverPackage *package=NULL;
ali@38
   125
    struct razor_error *err=NULL;
ali@44
   126
    gchar *uri;
ali@38
   127
    if (test_set)
ali@38
   128
    {
ali@38
   129
	razor_set_unref(test_set);
ali@38
   130
	test_set=NULL;
ali@38
   131
    }
ali@38
   132
    /*
ali@38
   133
     * yum metadata doesn't include all the information included in
ali@38
   134
     * a rpm file, so do this the hard way. Unfortunately,
ali@38
   135
     * razor_importer_add_rpm() doesn't support prefixes so we have
ali@38
   136
     * to do it the really hard way.
ali@38
   137
     */
ali@55
   138
    uri=g_strconcat("file:../yum-repo-test-dir/Packages/",name,"-",version,
ali@38
   139
      ".noarch.rpm",NULL);
ali@44
   140
    rpm=razor_rpm_open(uri,&err);
ali@38
   141
    if (!rpm)
ali@44
   142
	g_error("%s: %s",uri,razor_error_get_msg(err));
ali@44
   143
    g_free(uri);
ali@38
   144
    if (import_rpm(rpm))
ali@38
   145
	package=plover_package_new(test_set,test_pkg);
ali@38
   146
    else
ali@38
   147
	package=NULL;
ali@38
   148
    razor_rpm_close(rpm);
ali@38
   149
    return package;
ali@38
   150
}
ali@38
   151
ali@38
   152
static void test_basic_properties(void)
ali@38
   153
{
ali@38
   154
    PloverPackage *package;
ali@38
   155
    package=package_getref("zsh","1-1");
ali@38
   156
    g_assert(package != NULL);
ali@38
   157
    g_assert(plover_package_get_razor_set(package) == test_set);
ali@38
   158
    g_assert(plover_package_get_razor_package(package) == test_pkg);
ali@38
   159
    g_assert_cmpstr(plover_package_get_name(package),==,"zsh");
ali@38
   160
    g_assert_cmpstr(plover_package_get_summary(package),==,"Test package");
ali@38
   161
    g_assert_cmpstr(plover_package_get_version(package),==,"1-1");
ali@38
   162
    g_assert_cmpstr(plover_package_get_license(package),==,"GPL");
ali@38
   163
    g_assert_cmpstr(plover_package_get_arch(package),==,"noarch");
ali@38
   164
    g_assert_cmpstr(plover_package_get_description(package),==,"Test package");
ali@38
   165
    g_assert_cmpstr(plover_package_get_URL(package),==,
ali@38
   166
      "http://www.juiblex.co.uk/beach");
ali@38
   167
    g_object_unref(package);
ali@38
   168
}
ali@38
   169
ali@38
   170
static void test_package_properties(void)
ali@38
   171
{
ali@38
   172
    PloverPackage *package;
ali@38
   173
    struct razor_property_iterator *iter;
ali@38
   174
    struct razor_property *prop;
ali@38
   175
    uint32_t flags;
ali@38
   176
    const char *s,*name,*version;
ali@38
   177
    GString *str;
ali@38
   178
    GList *expected,*lnk;
ali@38
   179
    package=package_getref("zsh","1-1");
ali@38
   180
    g_assert(package != NULL);
ali@38
   181
    expected=g_list_prepend(NULL,
ali@38
   182
      (gpointer)g_intern_string("requires(pre,postun): zip"));
ali@38
   183
    expected=g_list_prepend(expected,
ali@38
   184
      (gpointer)g_intern_string("requires: zip"));
ali@38
   185
    expected=g_list_prepend(expected,
ali@38
   186
      (gpointer)g_intern_string("provides: zsh = 1-1"));
ali@38
   187
    iter=plover_package_property_iterator_create(package);
ali@38
   188
    g_assert(iter != NULL);
ali@38
   189
    while(razor_property_iterator_next(iter,&prop,&name,&flags,&version))
ali@38
   190
    {
ali@38
   191
	if (g_str_has_prefix(name,"rpmlib("))
ali@38
   192
	    continue;
ali@38
   193
	s=razor_property_type_to_string(prop);
ali@38
   194
	g_assert(s != NULL);
ali@38
   195
	str=g_string_new(s);
ali@38
   196
	if (flags&RAZOR_PROPERTY_SCRIPT_MASK)
ali@38
   197
	{
ali@38
   198
	    g_string_append_c(str,'(');
ali@38
   199
	    if (flags&RAZOR_PROPERTY_PRE)
ali@38
   200
		g_string_append(str,"pre");
ali@38
   201
	    if (flags&RAZOR_PROPERTY_POST)
ali@38
   202
	    {
ali@38
   203
		if (str->str[str->len-1]!='(' && str->str[str->len-1]!=',')
ali@38
   204
		    g_string_append_c(str,',');
ali@38
   205
		g_string_append(str,"post");
ali@38
   206
	    }
ali@38
   207
	    if (flags&RAZOR_PROPERTY_PREUN)
ali@38
   208
	    {
ali@38
   209
		if (str->str[str->len-1]!='(' && str->str[str->len-1]!=',')
ali@38
   210
		    g_string_append_c(str,',');
ali@38
   211
		g_string_append(str,"preun");
ali@38
   212
	    }
ali@38
   213
	    if (flags&RAZOR_PROPERTY_POSTUN)
ali@38
   214
	    {
ali@38
   215
		if (str->str[str->len-1]!='(' && str->str[str->len-1]!=',')
ali@38
   216
		    g_string_append_c(str,',');
ali@38
   217
		g_string_append(str,"postun");
ali@38
   218
	    }
ali@38
   219
	    g_string_append_c(str,')');
ali@38
   220
	}
ali@38
   221
	g_string_append(str,": ");
ali@38
   222
	g_string_append(str,name);
ali@38
   223
	if (*version)
ali@38
   224
	{
ali@38
   225
	    g_string_append_c(str,' ');
ali@38
   226
	    g_string_append(str,razor_property_relation_to_string(prop));
ali@38
   227
	    g_string_append_c(str,' ');
ali@38
   228
	    g_string_append(str,version);
ali@38
   229
	}
ali@38
   230
	lnk=g_list_find(expected,g_intern_string(str->str));
ali@38
   231
	if (!lnk)
ali@38
   232
	    g_warning("Unexpected property in zsh package: %s",str->str);
ali@38
   233
	else
ali@38
   234
	    expected=g_list_delete_link(expected,lnk);
ali@38
   235
	g_string_free(str,TRUE);
ali@38
   236
    }
ali@38
   237
    razor_property_iterator_destroy(iter);
ali@38
   238
    if (expected)
ali@38
   239
	g_warning("%d missing propert%s in set, including %s",
ali@38
   240
	  g_list_length(expected),g_list_length(expected)==1?"y":"ies",
ali@38
   241
	  expected->data);
ali@38
   242
    g_object_unref(package);
ali@38
   243
}
ali@38
   244
ali@38
   245
static void test_package_files(void)
ali@38
   246
{
ali@38
   247
    PloverPackage *package;
ali@38
   248
    struct razor_file_iterator *iter;
ali@38
   249
    const char *name;
ali@38
   250
    GList *expected,*lnk;
ali@38
   251
    package=package_getref("zsh","1-1");
ali@38
   252
    g_assert(package != NULL);
ali@38
   253
    expected=g_list_prepend(NULL,(gpointer)g_intern_string("/etc/zsh.conf"));
ali@38
   254
    expected=g_list_prepend(expected,(gpointer)g_intern_string("/usr/bin/zsh"));
ali@38
   255
    iter=plover_package_file_iterator_create(package,FALSE);
ali@38
   256
    g_assert(iter != NULL);
ali@38
   257
    while(razor_file_iterator_next(iter,&name))
ali@38
   258
    {
ali@38
   259
	lnk=g_list_find(expected,g_intern_string(name));
ali@38
   260
	if (!lnk)
ali@38
   261
	    g_warning("Unexpected file in zsh package: %s",name);
ali@38
   262
	else
ali@38
   263
	    expected=g_list_delete_link(expected,lnk);
ali@38
   264
    }
ali@38
   265
    razor_file_iterator_destroy(iter);
ali@38
   266
    if (expected)
ali@38
   267
	g_warning("%d missing file%s in set, including %s",
ali@38
   268
	  g_list_length(expected),g_list_length(expected)==1?"":"s",
ali@38
   269
	  expected->data);
ali@38
   270
    g_object_unref(package);
ali@38
   271
}
ali@38
   272
ali@38
   273
static void test_package_icon(void)
ali@38
   274
{
ali@38
   275
    /*
ali@38
   276
     * icons aren't supported yet.
ali@38
   277
     */
ali@38
   278
    PloverPackage *package;
ali@38
   279
    GInputStream *stream;
ali@38
   280
    GError *err=NULL;
ali@38
   281
    package=package_getref("zsh","1-1");
ali@38
   282
    g_assert(package != NULL);
ali@38
   283
    stream=plover_package_read_icon(package,&err);
ali@38
   284
    if (stream)
ali@38
   285
    {
ali@38
   286
	/* Unexpected, but hardly an error */
ali@38
   287
	g_object_unref(stream);
ali@38
   288
    }
ali@38
   289
    else
ali@38
   290
    {
ali@38
   291
	g_assert(err != NULL);
ali@38
   292
	g_assert(err->message != NULL);
ali@38
   293
	g_error_free(err);
ali@38
   294
    }
ali@38
   295
    g_object_unref(package);
ali@38
   296
}
ali@38
   297
ali@38
   298
static void test_package_prefixes(void)
ali@38
   299
{
ali@38
   300
    PloverPackage *package;
ali@38
   301
    const char *const *prefixes;
ali@38
   302
    package=package_getref("zsh","1-1");
ali@38
   303
    g_assert(package != NULL);
ali@38
   304
    prefixes=plover_package_get_prefixes(package);
ali@38
   305
    g_assert_cmpstr(prefixes[0], ==, "/usr");
ali@38
   306
    g_assert(prefixes[1] == NULL);
ali@38
   307
    g_object_unref(package);
ali@38
   308
}
ali@38
   309
ali@38
   310
int main(int argc,char **argv)
ali@38
   311
{
ali@38
   312
    int retval;
ali@38
   313
    g_test_init(&argc,&argv,NULL);
ali@38
   314
    g_test_bug_base("mailto:ali@juiblex.co.uk");
ali@38
   315
    g_test_add_func("/package/basic",test_basic_properties);
ali@38
   316
    g_test_add_func("/package/icons",test_package_icon);
ali@38
   317
    g_test_add_func("/package/properties",test_package_properties);
ali@38
   318
    g_test_add_func("/package/files",test_package_files);
ali@38
   319
    g_test_add_func("/package/prefixes",test_package_prefixes);
ali@38
   320
    g_test_message("PloverPackage::changed signal unused and thus untestable");
ali@38
   321
    retval=g_test_run();
ali@38
   322
    finalize();
ali@38
   323
    return retval;
ali@38
   324
}