Add test for non-file URI support
authorJ. Ali Harlow <ali@juiblex.co.uk>
Thu Jun 16 18:00:21 2016 +0100 (2016-06-16)
changeset 436b3034a884dc
parent 42 419a02fa70db
child 44 43ffed8669ce
Add test for non-file URI support
configure.ac
plover/comps.c
plover/fileio.h
plover/import-yum.c
plover/plover.h
plover/razor.c
plover/repository.c
plover/repository.h
plover/transaction.c
plover/transaction.h
tests/plover-gtk/Makefile.am
tests/plover/Makefile.am
tests/plover/test-fileio.c
     1.1 --- a/configure.ac	Thu Jun 16 12:11:14 2016 +0100
     1.2 +++ b/configure.ac	Thu Jun 16 18:00:21 2016 +0100
     1.3 @@ -114,8 +114,10 @@
     1.4  AC_CHECK_TOOL([RAZOR],[razor],[no])
     1.5  AC_CHECK_TOOL([RPMBUILD],[rpmbuild],[no])
     1.6  AC_CHECK_TOOL([CREATEREPO],[createrepo],[no])
     1.7 +AC_CHECK_TOOL([COMPILE_RESOURCES],[glib-compile-resources],[no])
     1.8  AM_CONDITIONAL([HAVE_CHECK_TOOLS],
     1.9 -  [test x$RAZOR != xno -a x$RPMBUILD != xno -a x$CREATEREPO != xno])
    1.10 +  [test x$RAZOR != xno -a x$RPMBUILD != xno -a x$CREATEREPO != xno -a \
    1.11 +   x$COMPILE_RESOURCES != xno])
    1.12  
    1.13  ##################################################
    1.14  # Checks for header files.
     2.1 --- a/plover/comps.c	Thu Jun 16 12:11:14 2016 +0100
     2.2 +++ b/plover/comps.c	Thu Jun 16 18:00:21 2016 +0100
     2.3 @@ -1,7 +1,7 @@
     2.4  /*
     2.5   * Copyright (C) 2008  Kristian Høgsberg <krh@redhat.com>
     2.6   * Copyright (C) 2008  Red Hat, Inc
     2.7 - * Copyright (C) 2009  J. Ali Harlow <ali@juiblex.co.uk>
     2.8 + * Copyright (C) 2009, 2016  J. Ali Harlow <ali@juiblex.co.uk>
     2.9   *
    2.10   * This program is free software; you can redistribute it and/or modify
    2.11   * it under the terms of the GNU General Public License as published by
    2.12 @@ -372,16 +372,20 @@
    2.13  
    2.14  #define XML_BUFFER_SIZE 4096
    2.15  
    2.16 -struct comps *plover_comps_new_from_file(const char *filename)
    2.17 +struct comps *plover_comps_new_from_uri(const char *uri)
    2.18  {
    2.19      struct comps_context ctx={0};
    2.20      void *buf;
    2.21 -    int len;
    2.22 -    FILE *fp;
    2.23 +    gssize len;
    2.24 +    GFile *file;
    2.25 +    GFileInputStream *stream;
    2.26      XML_ParsingStatus status;
    2.27      struct comps *comps;
    2.28 -    fp=fopen(filename,"r");
    2.29 -    if (!fp)
    2.30 +    plover__file_io_init();
    2.31 +    file=g_file_new_for_uri(uri);
    2.32 +    stream=g_file_read(file,NULL,NULL);
    2.33 +    g_object_unref(file);
    2.34 +    if (!stream)
    2.35  	return NULL;
    2.36      ctx.state=COMPS_STATE_BEGIN;
    2.37      ctx.parser=XML_ParserCreateNS(NULL,'\xFF');
    2.38 @@ -399,19 +403,20 @@
    2.39  	    case XML_PARSING:
    2.40  	    case XML_INITIALIZED:
    2.41  		buf=XML_GetBuffer(ctx.parser,XML_BUFFER_SIZE);
    2.42 -		len=fread(buf,1,XML_BUFFER_SIZE,fp);
    2.43 +		len=g_input_stream_read(G_INPUT_STREAM(stream),buf,
    2.44 +		  XML_BUFFER_SIZE,NULL,NULL);
    2.45  		if (len<0)
    2.46  		{
    2.47  		    comps_group_free(ctx.group);
    2.48  		    XML_ParserFree(ctx.parser);
    2.49 -		    fclose(fp);
    2.50 +		    g_object_unref(stream);
    2.51  		    return NULL;
    2.52  		}
    2.53  		if (!XML_ParseBuffer(ctx.parser,len,!len))
    2.54  		{
    2.55  		    comps_group_free(ctx.group);
    2.56  		    XML_ParserFree(ctx.parser);
    2.57 -		    fclose(fp);
    2.58 +		    g_object_unref(stream);
    2.59  		    return NULL;
    2.60  		}
    2.61  		break;
    2.62 @@ -420,13 +425,26 @@
    2.63  	}
    2.64      } while (status.parsing!=XML_FINISHED);
    2.65      XML_ParserFree(ctx.parser);
    2.66 -    fclose(fp);
    2.67 +    g_object_unref(stream);
    2.68      comps=plover_comps_new();
    2.69      comps->vendor=ctx.vendor;
    2.70      comps->groups=ctx.group;
    2.71      return comps;
    2.72  }
    2.73  
    2.74 +struct comps *plover_comps_new_from_file(const char *filename)
    2.75 +{
    2.76 +    gchar *uri;
    2.77 +    GFile *file;
    2.78 +    struct comps *comps;
    2.79 +    file=g_file_new_for_path(filename);
    2.80 +    uri=g_file_get_uri(file);
    2.81 +    g_object_unref(file);
    2.82 +    comps=plover_comps_new_from_uri(uri);
    2.83 +    g_free(uri);
    2.84 +    return comps;
    2.85 +}
    2.86 +
    2.87  struct comps_group *plover_comps_lookup_group(struct comps *comps,
    2.88    const char *id)
    2.89  {
     3.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     3.2 +++ b/plover/fileio.h	Thu Jun 16 18:00:21 2016 +0100
     3.3 @@ -0,0 +1,10 @@
     3.4 +#ifndef __FILEIO_H__
     3.5 +#define __FILEIO_H__
     3.6 +
     3.7 +G_BEGIN_DECLS
     3.8 +
     3.9 +void plover__file_io_init(void);
    3.10 +
    3.11 +G_END_DECLS
    3.12 +
    3.13 +#endif /* __FILEIO_H__ */
     4.1 --- a/plover/import-yum.c	Thu Jun 16 12:11:14 2016 +0100
     4.2 +++ b/plover/import-yum.c	Thu Jun 16 18:00:21 2016 +0100
     4.3 @@ -307,18 +307,19 @@
     4.4  
     4.5  #define XML_BUFFER_SIZE 4096
     4.6  
     4.7 -struct razor_set *plover_razor_set_create_from_yum(const char *base,
     4.8 +struct razor_set *plover_razor_set_create_from_yum_uri(const char *base_uri,
     4.9    GError **error)
    4.10  {
    4.11      struct yum_context ctx;
    4.12      gchar *s;
    4.13      void *buf;
    4.14 -    int len;
    4.15 -    gzFile primary, filelists;
    4.16 +    gssize len;
    4.17 +    GFile *file;
    4.18 +    GFileInputStream *stream;
    4.19 +    GInputStream *primary,*filelists;
    4.20 +    GZlibDecompressor *decompressor;
    4.21      XML_ParsingStatus status;
    4.22      struct razor_set *set;
    4.23 -    int errnum;
    4.24 -    const char *errstr,*errobj;
    4.25      plover__file_io_init();
    4.26      ctx.importer=razor_importer_create();
    4.27      ctx.state=YUM_STATE_BEGIN;
    4.28 @@ -332,27 +333,30 @@
    4.29      XML_SetElementHandler(ctx.filelists_parser,yum_filelists_start_element,
    4.30        yum_filelists_end_element);
    4.31      XML_SetCharacterDataHandler(ctx.filelists_parser,yum_character_data);
    4.32 -    errno=0;
    4.33 -    s=g_build_filename(base,"repodata","primary.xml.gz",NULL);
    4.34 -    primary=gzopen(s,"rb");
    4.35 -    if (!primary)
    4.36 -    {
    4.37 -	g_set_error(error,RAZOR_POSIX_ERROR,errno?errno:ENOMEM,
    4.38 -	  "%s: %s",s,strerror(errno));
    4.39 -	g_free(s);
    4.40 +    s=g_build_filename(base_uri,"repodata","primary.xml.gz",NULL);
    4.41 +    file=g_file_new_for_uri(s);
    4.42 +    g_free(s);
    4.43 +    stream=g_file_read(file,NULL,error);
    4.44 +    g_object_unref(file);
    4.45 +    if (!stream)
    4.46  	return NULL;
    4.47 -    }
    4.48 +    decompressor=g_zlib_decompressor_new(G_ZLIB_COMPRESSOR_FORMAT_GZIP);
    4.49 +    primary=g_converter_input_stream_new(G_INPUT_STREAM(stream),
    4.50 +      G_CONVERTER(decompressor));
    4.51 +    g_object_unref(stream);
    4.52 +    g_object_unref(decompressor);
    4.53 +    s=g_build_filename(base_uri,"repodata","filelists.xml.gz",NULL);
    4.54 +    file=g_file_new_for_uri(s);
    4.55      g_free(s);
    4.56 -    s=g_build_filename(base,"repodata","filelists.xml.gz",NULL);
    4.57 -    filelists=gzopen(s,"rb");
    4.58 -    if (!filelists)
    4.59 -    {
    4.60 -	g_set_error(error,RAZOR_POSIX_ERROR,errno?errno:ENOMEM,
    4.61 -	  "%s: %s",s,strerror(errno));
    4.62 -	g_free(s);
    4.63 +    stream=g_file_read(file,NULL,error);
    4.64 +    g_object_unref(file);
    4.65 +    if (!stream)
    4.66  	return NULL;
    4.67 -    }
    4.68 -    g_free(s);
    4.69 +    decompressor=g_zlib_decompressor_new(G_ZLIB_COMPRESSOR_FORMAT_GZIP);
    4.70 +    filelists=g_converter_input_stream_new(G_INPUT_STREAM(stream),
    4.71 +      G_CONVERTER(decompressor));
    4.72 +    g_object_unref(stream);
    4.73 +    g_object_unref(decompressor);
    4.74      ctx.current_parser=ctx.primary_parser;
    4.75      ctx.current=0;
    4.76      do
    4.77 @@ -367,29 +371,13 @@
    4.78  	    case XML_INITIALIZED:
    4.79  		buf=XML_GetBuffer(ctx.current_parser,XML_BUFFER_SIZE);
    4.80  		if (ctx.current_parser==ctx.primary_parser)
    4.81 -		    len=gzread(primary,buf,XML_BUFFER_SIZE);
    4.82 +		    len=g_input_stream_read(G_INPUT_STREAM(primary),buf,
    4.83 +		      XML_BUFFER_SIZE,NULL,error);
    4.84  		else
    4.85 -		    len=gzread(filelists,buf,XML_BUFFER_SIZE);
    4.86 +		    len=g_input_stream_read(G_INPUT_STREAM(filelists),buf,
    4.87 +		      XML_BUFFER_SIZE,NULL,error);
    4.88  		if (len<0)
    4.89 -		{
    4.90 -		    if (ctx.current_parser==ctx.primary_parser)
    4.91 -		    {
    4.92 -			errstr=gzerror(primary,&errnum);
    4.93 -			errobj="primary.xml.gz";
    4.94 -		    }
    4.95 -		    else
    4.96 -		    {
    4.97 -			errstr=gzerror(filelists,&errnum);
    4.98 -			errobj="filelists.xml.gz";
    4.99 -		    }
   4.100 -		    if (errnum==Z_ERRNO)
   4.101 -			g_set_error(error,PLOVER_POSIX_ERROR,errno,"%s: %s",
   4.102 -			  errobj,strerror(errno));
   4.103 -		    else
   4.104 -			g_set_error(error,RAZOR_ZLIB_ERROR,errnum,"%s: %s",
   4.105 -			  errobj,errstr);
   4.106  		    return NULL;
   4.107 -		}
   4.108  		XML_ParseBuffer(ctx.current_parser,len,!len);
   4.109  		break;
   4.110  	    case XML_FINISHED:
   4.111 @@ -398,8 +386,8 @@
   4.112      } while (status.parsing!=XML_FINISHED);
   4.113      XML_ParserFree(ctx.primary_parser);
   4.114      XML_ParserFree(ctx.filelists_parser);
   4.115 -    gzclose(primary);
   4.116 -    gzclose(filelists);
   4.117 +    g_object_unref(primary);
   4.118 +    g_object_unref(filelists);
   4.119      set=razor_importer_finish(ctx.importer);
   4.120  #if RAZOR_HEADER_VERSION_MIN<=1
   4.121      /*
   4.122 @@ -415,3 +403,17 @@
   4.123  #endif
   4.124      return set;
   4.125  }
   4.126 +
   4.127 +struct razor_set *plover_razor_set_create_from_yum(const char *base,
   4.128 +  GError **error)
   4.129 +{
   4.130 +    gchar *base_uri;
   4.131 +    GFile *file;
   4.132 +    struct razor_set *set;
   4.133 +    file=g_file_new_for_path(base);
   4.134 +    base_uri=g_file_get_uri(file);
   4.135 +    g_object_unref(file);
   4.136 +    set=plover_razor_set_create_from_yum_uri(base_uri,error);
   4.137 +    g_free(base_uri);
   4.138 +    return set;
   4.139 +}
     5.1 --- a/plover/plover.h	Thu Jun 16 12:11:14 2016 +0100
     5.2 +++ b/plover/plover.h	Thu Jun 16 18:00:21 2016 +0100
     5.3 @@ -74,6 +74,8 @@
     5.4  void plover_propagate_razor_error(GError **dest,struct razor_error *src);
     5.5  void plover_propagate_g_error(struct razor_error **dest,GError *src);
     5.6  
     5.7 +struct razor_set *plover_razor_set_create_from_yum_uri(const char *base_uri,
     5.8 +  GError **error);
     5.9  struct razor_set *plover_razor_set_create_from_yum(const char *base,
    5.10    GError **error);
    5.11  
    5.12 @@ -90,6 +92,7 @@
    5.13  int plover_installed_files_match_prefix(const char *prefix);
    5.14  
    5.15  struct comps *plover_comps_new(void);
    5.16 +struct comps *plover_comps_new_from_uri(const char *uri);
    5.17  struct comps *plover_comps_new_from_file(const char *filename);
    5.18  void plover_comps_free(struct comps *comps);
    5.19  struct comps_group *plover_comps_lookup_group(struct comps *comps,
     6.1 --- a/plover/razor.c	Thu Jun 16 12:11:14 2016 +0100
     6.2 +++ b/plover/razor.c	Thu Jun 16 18:00:21 2016 +0100
     6.3 @@ -177,16 +177,30 @@
     6.4      return 0;
     6.5  }
     6.6  
     6.7 +gboolean plover_install_uri(const char *base_uri,const char *prefix,char **pkgs,
     6.8 +  GError **error)
     6.9 +{
    6.10 +    gboolean retval;
    6.11 +    PloverTransaction *transaction;
    6.12 +    transaction=plover_transaction_new_install_uri(base_uri,prefix,pkgs,error);
    6.13 +    if (!transaction)
    6.14 +	return FALSE;
    6.15 +    retval=plover_transaction_commit(transaction,NULL,error);
    6.16 +    g_object_unref(transaction);
    6.17 +    return retval;
    6.18 +}
    6.19 +
    6.20  gboolean plover_install(const char *base,const char *prefix,char **pkgs,
    6.21    GError **error)
    6.22  {
    6.23      gboolean retval;
    6.24 -    PloverTransaction *transaction;
    6.25 -    transaction=plover_transaction_new_install(base,prefix,pkgs,error);
    6.26 -    if (!transaction)
    6.27 -	return FALSE;
    6.28 -    retval=plover_transaction_commit(transaction,NULL,error);
    6.29 -    g_object_unref(transaction);
    6.30 +    GFile *file;
    6.31 +    gchar *base_uri;
    6.32 +    file=g_file_new_for_path(base);
    6.33 +    base_uri=g_file_get_uri(file);
    6.34 +    g_object_unref(file);
    6.35 +    retval=plover_install_uri(base_uri,prefix,pkgs,error);
    6.36 +    g_free(base_uri);
    6.37      return retval;
    6.38  }
    6.39  
     7.1 --- a/plover/repository.c	Thu Jun 16 12:11:14 2016 +0100
     7.2 +++ b/plover/repository.c	Thu Jun 16 18:00:21 2016 +0100
     7.3 @@ -102,7 +102,7 @@
     7.4      return g_strconcat(name,"-",v,".",arch,".rpm",NULL);
     7.5  }
     7.6  
     7.7 -PloverRepository *plover_repository_new_from_yum(const char *base,
     7.8 +PloverRepository *plover_repository_new_from_yum_uri(const char *base_uri,
     7.9    GError **error)
    7.10  {
    7.11      char *s;
    7.12 @@ -114,15 +114,9 @@
    7.13      PloverPackageSet *set;
    7.14      PloverRepository *repository;
    7.15      PloverRepositoryPrivate *priv;
    7.16 -    GFile *file;
    7.17 -    gchar *uri;
    7.18 -    imported=plover_razor_set_create_from_yum(base,error);
    7.19 +    imported=plover_razor_set_create_from_yum_uri(base_uri,error);
    7.20      if (!imported)
    7.21  	return NULL;
    7.22 -    file=g_file_new_for_path(base);
    7.23 -    uri=g_file_get_uri(file);
    7.24 -    g_object_unref(file);
    7.25 -    g_message("Using %s as URI",uri);
    7.26      set=plover_package_set_new_from_razor(imported);
    7.27      razor_set_unref(imported);
    7.28      repository=g_object_new(PLOVER_TYPE_REPOSITORY,NULL);
    7.29 @@ -133,14 +127,27 @@
    7.30        RAZOR_DETAIL_VERSION,&version,RAZOR_DETAIL_ARCH,&arch,RAZOR_DETAIL_LAST))
    7.31      {
    7.32  	s=rpm_filename(name,version,arch);
    7.33 -	g_ptr_array_add(uris,g_build_filename(uri,"rpms",s,NULL));
    7.34 +	g_ptr_array_add(uris,g_build_filename(base_uri,"rpms",s,NULL));
    7.35  	free(s);
    7.36      }
    7.37      razor_package_iterator_destroy(pi);
    7.38      g_ptr_array_add(uris,NULL);
    7.39      priv->uris=(gchar **)g_ptr_array_free(uris,FALSE);
    7.40      priv->set=set;
    7.41 -    g_free(uri);
    7.42 +    return repository;
    7.43 +}
    7.44 +
    7.45 +PloverRepository *plover_repository_new_from_yum(const char *base,
    7.46 +  GError **error)
    7.47 +{
    7.48 +    PloverRepository *repository;
    7.49 +    gchar *base_uri;
    7.50 +    GFile *file;
    7.51 +    file=g_file_new_for_path(base);
    7.52 +    base_uri=g_file_get_uri(file);
    7.53 +    g_object_unref(file);
    7.54 +    repository=plover_repository_new_from_yum_uri(base_uri,error);
    7.55 +    g_free(base_uri);
    7.56      return repository;
    7.57  }
    7.58  
     8.1 --- a/plover/repository.h	Thu Jun 16 12:11:14 2016 +0100
     8.2 +++ b/plover/repository.h	Thu Jun 16 18:00:21 2016 +0100
     8.3 @@ -37,6 +37,8 @@
     8.4  GType plover_repository_get_type(void) G_GNUC_CONST;
     8.5  PloverRepository *plover_repository_new_from_files(const char **filenames,
     8.6    GError **error);
     8.7 +PloverRepository *plover_repository_new_from_yum_uri(const char *base_uri,
     8.8 +  GError **error);
     8.9  PloverRepository *plover_repository_new_from_yum(const char *base,
    8.10    GError **error);
    8.11  PloverPackageSet *
     9.1 --- a/plover/transaction.c	Thu Jun 16 12:11:14 2016 +0100
     9.2 +++ b/plover/transaction.c	Thu Jun 16 18:00:21 2016 +0100
     9.3 @@ -493,14 +493,14 @@
     9.4  }
     9.5  
     9.6  gboolean
     9.7 -  plover_transaction_set_upstream_from_yum(PloverTransaction *transaction,
     9.8 -  const char *base,GError **error)
     9.9 +  plover_transaction_set_upstream_from_yum_uri(PloverTransaction *transaction,
    9.10 +  const char *base_uri,GError **error)
    9.11  {
    9.12      gboolean retval;
    9.13      PloverRepository *upstream;
    9.14      g_return_val_if_fail(PLOVER_IS_TRANSACTION(transaction),FALSE);
    9.15      g_return_val_if_fail(transaction->upstream == NULL,FALSE);
    9.16 -    upstream=plover_repository_new_from_yum(base,error);
    9.17 +    upstream=plover_repository_new_from_yum_uri(base_uri,error);
    9.18      if (!upstream)
    9.19  	return FALSE;
    9.20      retval=plover_transaction_set_upstream(transaction,upstream,error);
    9.21 @@ -508,6 +508,21 @@
    9.22      return retval;
    9.23  }
    9.24  
    9.25 +gboolean
    9.26 +  plover_transaction_set_upstream_from_yum(PloverTransaction *transaction,
    9.27 +  const char *base,GError **error)
    9.28 +{
    9.29 +    gboolean retval;
    9.30 +    gchar *base_uri;
    9.31 +    GFile *file;
    9.32 +    file=g_file_new_for_path(base);
    9.33 +    base_uri=g_file_get_uri(file);
    9.34 +    g_object_unref(file);
    9.35 +    retval=plover_transaction_set_upstream_from_yum_uri(transaction,base_uri,error);
    9.36 +    g_free(base_uri);
    9.37 +    return retval;
    9.38 +}
    9.39 +
    9.40  gboolean plover_transaction_install(PloverTransaction *transaction,
    9.41    char **pkgs,GError **error)
    9.42  {
    9.43 @@ -581,13 +596,13 @@
    9.44      return TRUE;
    9.45  }
    9.46  
    9.47 -PloverTransaction *plover_transaction_new_install(const char *base,
    9.48 +PloverTransaction *plover_transaction_new_install_uri(const char *base_uri,
    9.49    const char *prefix,char **pkgs,GError **error)
    9.50  {
    9.51      PloverTransaction *transaction;
    9.52      transaction=plover_transaction_new();
    9.53      plover_transaction_set_prefix(transaction,prefix);
    9.54 -    if (!plover_transaction_set_upstream_from_yum(transaction,base,error))
    9.55 +    if (!plover_transaction_set_upstream_from_yum_uri(transaction,base_uri,error))
    9.56      {
    9.57  	g_object_unref(transaction);
    9.58  	return NULL;
    9.59 @@ -600,6 +615,20 @@
    9.60      return transaction;
    9.61  }
    9.62  
    9.63 +PloverTransaction *plover_transaction_new_install(const char *base,
    9.64 +  const char *prefix,char **pkgs,GError **error)
    9.65 +{
    9.66 +    PloverTransaction *transaction;
    9.67 +    gchar *base_uri;
    9.68 +    GFile *file;
    9.69 +    file=g_file_new_for_path(base);
    9.70 +    base_uri=g_file_get_uri(file);
    9.71 +    g_object_unref(file);
    9.72 +    transaction=plover_transaction_new_install_uri(base_uri,prefix,pkgs,error);
    9.73 +    g_free(base_uri);
    9.74 +    return transaction;
    9.75 +}
    9.76 +
    9.77  PloverTransaction *plover_transaction_new_update(const char *base,
    9.78    const char *prefix,char **pkgs,GError **error)
    9.79  {
    10.1 --- a/plover/transaction.h	Thu Jun 16 12:11:14 2016 +0100
    10.2 +++ b/plover/transaction.h	Thu Jun 16 18:00:21 2016 +0100
    10.3 @@ -52,10 +52,15 @@
    10.4  gboolean plover_transaction_set_upstream(PloverTransaction *transaction,
    10.5    PloverRepository *upstream,GError **error);
    10.6  gboolean
    10.7 +  plover_transaction_set_upstream_from_yum_uri(PloverTransaction *transaction,
    10.8 +  const char *base_uri,GError **error);
    10.9 +gboolean
   10.10    plover_transaction_set_upstream_from_yum(PloverTransaction *transaction,
   10.11    const char *base,GError **error);
   10.12  gboolean plover_transaction_install(PloverTransaction *transaction,
   10.13    char **pkgs,GError **error);
   10.14 +PloverTransaction *plover_transaction_new_install_uri(const char *base_uri,
   10.15 +  const char *prefix,char **pkgs,GError **error);
   10.16  PloverTransaction *plover_transaction_new_install(const char *base,
   10.17    const char *prefix,char **pkgs,GError **error);
   10.18  gboolean plover_transaction_update(PloverTransaction *transaction,
    11.1 --- a/tests/plover-gtk/Makefile.am	Thu Jun 16 12:11:14 2016 +0100
    11.2 +++ b/tests/plover-gtk/Makefile.am	Thu Jun 16 18:00:21 2016 +0100
    11.3 @@ -3,11 +3,13 @@
    11.4  LDADD=../../plover-gtk/libplover-gtk.la ../../plover/libplover.la \
    11.5    $(PLOVER_GTK_LIBS)
    11.6  
    11.7 +TEST_EXTENSIONS =
    11.8 +
    11.9  if HAVE_CHECK_TOOLS
   11.10  
   11.11  TESTS = $(txt_tests) $(gui_tests:=.xvfb)
   11.12  TESTS_ENVIRONMENT = gtk_srcdir="$(top_srcdir)/plover-gtk"
   11.13 -TEST_EXTENSIONS = .xvfb
   11.14 +TEST_EXTENSIONS += .xvfb
   11.15  XVFB_LOG_COMPILER = $(top_srcdir)/tests/xvfb-run
   11.16  XVFB_LOG_FLAGS = --auto-servernum --auth-file .Xauthority
   11.17  
    12.1 --- a/tests/plover/Makefile.am	Thu Jun 16 12:11:14 2016 +0100
    12.2 +++ b/tests/plover/Makefile.am	Thu Jun 16 18:00:21 2016 +0100
    12.3 @@ -11,10 +11,32 @@
    12.4  
    12.5  test_programs = test-import-yum test-package test-repository test-packageset \
    12.6  	test-transaction test-comps test-log test-util test-razor test-vector \
    12.7 -	test-exception-handler
    12.8 +	test-exception-handler test-fileio
    12.9  
   12.10  test_transaction_LDADD = $(LDADD) $(LUA_POSIX_LIBS)
   12.11  test_razor_LDADD = $(LDADD) $(LUA_POSIX_LIBS)
   12.12 +test_fileio_SOURCES = test-fileio.c test-fileio-gresource.c
   12.13 +test_fileio_DEPENDENCIES = test-fileio-gresource.h
   12.14 +test_fileio_LDADD = $(LDADD) $(LUA_POSIX_LIBS)
   12.15 +
   12.16 +test-fileio-gresource.c: test-fileio.gresource.xml
   12.17 +	$(AM_V_GEN)$(COMPILE_RESOURCES) --target=$@ --generate \
   12.18 +	  --sourcedir=../yum-repo-test-dir --manual-register \
   12.19 +	  test-fileio.gresource.xml
   12.20 +
   12.21 +test-fileio-gresource.h: test-fileio.gresource.xml
   12.22 +	$(AM_V_GEN)$(COMPILE_RESOURCES) --target=$@ --generate \
   12.23 +	  --sourcedir=../yum-repo-test-dir --manual-register \
   12.24 +	  test-fileio.gresource.xml
   12.25 +
   12.26 +test-fileio.gresource.xml:
   12.27 +	$(AM_V_GEN)(cd ../yum-repo-test-dir; \
   12.28 +	  echo '<?xml version="1.0" encoding="UTF-8"?>'; \
   12.29 +	  echo '<gresources>'; \
   12.30 +	  echo '<gresource prefix="/uk/co/juiblex/project/plover">'; \
   12.31 +	  find . -type f -print | sed -e 's/^\.\/\(.*\)$$/<file>\1<\/file>/'; \
   12.32 +	  echo '</gresource>'; \
   12.33 +	  echo '</gresources>') > $@
   12.34  
   12.35  endif
   12.36  
   12.37 @@ -23,3 +45,6 @@
   12.38  
   12.39  clean-local:
   12.40  	rm -rf test-log-rotate razor-test-dir-*
   12.41 +
   12.42 +CLEANFILES = test-fileio-gresource.c test-fileio-gresource.h \
   12.43 +	test-fileio.gresource.xml
    13.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    13.2 +++ b/tests/plover/test-fileio.c	Thu Jun 16 18:00:21 2016 +0100
    13.3 @@ -0,0 +1,113 @@
    13.4 +/*
    13.5 + * Copyright (C) 2009, 2011, 2016  J. Ali Harlow <ali@juiblex.co.uk>
    13.6 + *
    13.7 + * This program is free software; you can redistribute it and/or modify
    13.8 + * it under the terms of the GNU General Public License as published by
    13.9 + * the Free Software Foundation; either version 2 of the License, or
   13.10 + * (at your option) any later version.
   13.11 + *
   13.12 + * This program is distributed in the hope that it will be useful,
   13.13 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
   13.14 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   13.15 + * GNU General Public License for more details.
   13.16 + *
   13.17 + * You should have received a copy of the GNU General Public License along
   13.18 + * with this program; if not, write to the Free Software Foundation, Inc.,
   13.19 + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
   13.20 + */
   13.21 +
   13.22 +#include <stdlib.h>
   13.23 +#include <stdio.h>
   13.24 +#include <string.h>
   13.25 +#include <limits.h>
   13.26 +#include <lua.h>
   13.27 +#include "config.h"
   13.28 +#include "plover/plover.h"
   13.29 +#include "test-fileio-gresource.h"
   13.30 +
   13.31 +LUALIB_API int luaopen_posix(lua_State *L);
   13.32 +
   13.33 +void test_resource(void)
   13.34 +{
   13.35 +    gchar *prefix,*root,*root_uri,*s;
   13.36 +    int ch,changed;
   13.37 +    struct comps *comps;
   13.38 +    struct comps_group *group;
   13.39 +    struct comps_requirement *pkg;
   13.40 +    struct plover_vector *packages=NULL;
   13.41 +    GError *error=NULL;
   13.42 +    GFile *file;
   13.43 +    test_fileio_register_resource();
   13.44 +    root=g_strdup("razor-test-dir-XXXXXX");
   13.45 +    g_assert(mkdtemp(root));
   13.46 +    file=g_file_new_for_path(root);
   13.47 +    root_uri=g_file_get_uri(file);
   13.48 +    g_object_unref(file);
   13.49 +    g_setenv("RAZOR_ROOT",root_uri,TRUE);
   13.50 +    g_free(root_uri);
   13.51 +    comps=plover_comps_new_from_uri(
   13.52 +      "resource:///uk/co/juiblex/project/plover/repodata/comps.xml");
   13.53 +    if (!comps)
   13.54 +    {
   13.55 +	perror("resource:///uk/co/juiblex/project/plover/repodata/comps.xml");
   13.56 +	exit(1);
   13.57 +    }
   13.58 +    prefix=plover_default_prefix_for_vendor(comps->vendor);
   13.59 +    group=plover_comps_lookup_group(comps,"base");
   13.60 +    if (!group)
   13.61 +    {
   13.62 +	fprintf(stderr,"No base group found in comps.xml\n");
   13.63 +	exit(1);
   13.64 +    }
   13.65 +    packages=plover_vector_new();
   13.66 +    do
   13.67 +    {
   13.68 +	changed=0;
   13.69 +	for(pkg=group->packages;pkg;pkg=pkg->next)
   13.70 +	{
   13.71 +	    if (plover_vector_contains(packages,pkg->name))
   13.72 +		continue;
   13.73 +	    if (pkg->type==COMPS_REQUIREMENT_DEFAULT ||
   13.74 +	      pkg->type==COMPS_REQUIREMENT_MANDATORY ||
   13.75 +	      pkg->type==COMPS_REQUIREMENT_CONDITIONAL && (!pkg->requires ||
   13.76 +	      plover_vector_contains(packages,pkg->requires)))
   13.77 +	    {
   13.78 +		changed++;
   13.79 +		plover_vector_append(packages,pkg->name);
   13.80 +	    }
   13.81 +	}
   13.82 +    } while(changed);
   13.83 +    plover_comps_free(comps);
   13.84 +    if (!packages->len)
   13.85 +    {
   13.86 +	fprintf(stderr,"No packages to install\n");
   13.87 +	exit(1);
   13.88 +    }
   13.89 +    if (!plover_install_uri("resource:///uk/co/juiblex/project/plover",prefix,
   13.90 +      packages->strings,&error))
   13.91 +    {
   13.92 +	fprintf(stderr,"%s\n",error->message);
   13.93 +	g_error_free(error);
   13.94 +	exit(1);
   13.95 +    }
   13.96 +    plover_vector_free(packages);
   13.97 +    g_free(prefix);
   13.98 +    g_unsetenv("RAZOR_ROOT");
   13.99 +    test_fileio_unregister_resource();
  13.100 +    s=g_build_filename(root,"usr/bin/zsh",NULL);
  13.101 +    g_free(root);
  13.102 +    if (!g_file_test(s,G_FILE_TEST_EXISTS))
  13.103 +	g_error("%s: Missing file",s);
  13.104 +    g_free(s);
  13.105 +}
  13.106 +
  13.107 +int main(int argc,char **argv)
  13.108 +{
  13.109 +    int retval;
  13.110 +    razor_set_lua_loader("posix",(void (*)())luaopen_posix);
  13.111 +    g_test_init(&argc,&argv,NULL);
  13.112 +    g_test_bug_base("mailto:ali@juiblex.co.uk");
  13.113 +    g_test_add_func("/fileio/resource",test_resource);
  13.114 +    retval=g_test_run();
  13.115 +    return retval;
  13.116 +}