# HG changeset patch # User J. Ali Harlow # Date 1466096421 -3600 # Node ID 6b3034a884dcf6d8c9f2eed87a0bc2072f9ac2ac # Parent 419a02fa70dba9493ac8788a0e3b6ea2dd6e0931 Add test for non-file URI support diff -r 419a02fa70db -r 6b3034a884dc configure.ac --- a/configure.ac Thu Jun 16 12:11:14 2016 +0100 +++ b/configure.ac Thu Jun 16 18:00:21 2016 +0100 @@ -114,8 +114,10 @@ AC_CHECK_TOOL([RAZOR],[razor],[no]) AC_CHECK_TOOL([RPMBUILD],[rpmbuild],[no]) AC_CHECK_TOOL([CREATEREPO],[createrepo],[no]) +AC_CHECK_TOOL([COMPILE_RESOURCES],[glib-compile-resources],[no]) AM_CONDITIONAL([HAVE_CHECK_TOOLS], - [test x$RAZOR != xno -a x$RPMBUILD != xno -a x$CREATEREPO != xno]) + [test x$RAZOR != xno -a x$RPMBUILD != xno -a x$CREATEREPO != xno -a \ + x$COMPILE_RESOURCES != xno]) ################################################## # Checks for header files. diff -r 419a02fa70db -r 6b3034a884dc plover/comps.c --- a/plover/comps.c Thu Jun 16 12:11:14 2016 +0100 +++ b/plover/comps.c Thu Jun 16 18:00:21 2016 +0100 @@ -1,7 +1,7 @@ /* * Copyright (C) 2008 Kristian Høgsberg * Copyright (C) 2008 Red Hat, Inc - * Copyright (C) 2009 J. Ali Harlow + * Copyright (C) 2009, 2016 J. Ali Harlow * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -372,16 +372,20 @@ #define XML_BUFFER_SIZE 4096 -struct comps *plover_comps_new_from_file(const char *filename) +struct comps *plover_comps_new_from_uri(const char *uri) { struct comps_context ctx={0}; void *buf; - int len; - FILE *fp; + gssize len; + GFile *file; + GFileInputStream *stream; XML_ParsingStatus status; struct comps *comps; - fp=fopen(filename,"r"); - if (!fp) + plover__file_io_init(); + file=g_file_new_for_uri(uri); + stream=g_file_read(file,NULL,NULL); + g_object_unref(file); + if (!stream) return NULL; ctx.state=COMPS_STATE_BEGIN; ctx.parser=XML_ParserCreateNS(NULL,'\xFF'); @@ -399,19 +403,20 @@ case XML_PARSING: case XML_INITIALIZED: buf=XML_GetBuffer(ctx.parser,XML_BUFFER_SIZE); - len=fread(buf,1,XML_BUFFER_SIZE,fp); + len=g_input_stream_read(G_INPUT_STREAM(stream),buf, + XML_BUFFER_SIZE,NULL,NULL); if (len<0) { comps_group_free(ctx.group); XML_ParserFree(ctx.parser); - fclose(fp); + g_object_unref(stream); return NULL; } if (!XML_ParseBuffer(ctx.parser,len,!len)) { comps_group_free(ctx.group); XML_ParserFree(ctx.parser); - fclose(fp); + g_object_unref(stream); return NULL; } break; @@ -420,13 +425,26 @@ } } while (status.parsing!=XML_FINISHED); XML_ParserFree(ctx.parser); - fclose(fp); + g_object_unref(stream); comps=plover_comps_new(); comps->vendor=ctx.vendor; comps->groups=ctx.group; return comps; } +struct comps *plover_comps_new_from_file(const char *filename) +{ + gchar *uri; + GFile *file; + struct comps *comps; + file=g_file_new_for_path(filename); + uri=g_file_get_uri(file); + g_object_unref(file); + comps=plover_comps_new_from_uri(uri); + g_free(uri); + return comps; +} + struct comps_group *plover_comps_lookup_group(struct comps *comps, const char *id) { diff -r 419a02fa70db -r 6b3034a884dc plover/fileio.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/plover/fileio.h Thu Jun 16 18:00:21 2016 +0100 @@ -0,0 +1,10 @@ +#ifndef __FILEIO_H__ +#define __FILEIO_H__ + +G_BEGIN_DECLS + +void plover__file_io_init(void); + +G_END_DECLS + +#endif /* __FILEIO_H__ */ diff -r 419a02fa70db -r 6b3034a884dc plover/import-yum.c --- a/plover/import-yum.c Thu Jun 16 12:11:14 2016 +0100 +++ b/plover/import-yum.c Thu Jun 16 18:00:21 2016 +0100 @@ -307,18 +307,19 @@ #define XML_BUFFER_SIZE 4096 -struct razor_set *plover_razor_set_create_from_yum(const char *base, +struct razor_set *plover_razor_set_create_from_yum_uri(const char *base_uri, GError **error) { struct yum_context ctx; gchar *s; void *buf; - int len; - gzFile primary, filelists; + gssize len; + GFile *file; + GFileInputStream *stream; + GInputStream *primary,*filelists; + GZlibDecompressor *decompressor; XML_ParsingStatus status; struct razor_set *set; - int errnum; - const char *errstr,*errobj; plover__file_io_init(); ctx.importer=razor_importer_create(); ctx.state=YUM_STATE_BEGIN; @@ -332,27 +333,30 @@ XML_SetElementHandler(ctx.filelists_parser,yum_filelists_start_element, yum_filelists_end_element); XML_SetCharacterDataHandler(ctx.filelists_parser,yum_character_data); - errno=0; - s=g_build_filename(base,"repodata","primary.xml.gz",NULL); - primary=gzopen(s,"rb"); - if (!primary) - { - g_set_error(error,RAZOR_POSIX_ERROR,errno?errno:ENOMEM, - "%s: %s",s,strerror(errno)); - g_free(s); + s=g_build_filename(base_uri,"repodata","primary.xml.gz",NULL); + file=g_file_new_for_uri(s); + g_free(s); + stream=g_file_read(file,NULL,error); + g_object_unref(file); + if (!stream) return NULL; - } + decompressor=g_zlib_decompressor_new(G_ZLIB_COMPRESSOR_FORMAT_GZIP); + primary=g_converter_input_stream_new(G_INPUT_STREAM(stream), + G_CONVERTER(decompressor)); + g_object_unref(stream); + g_object_unref(decompressor); + s=g_build_filename(base_uri,"repodata","filelists.xml.gz",NULL); + file=g_file_new_for_uri(s); g_free(s); - s=g_build_filename(base,"repodata","filelists.xml.gz",NULL); - filelists=gzopen(s,"rb"); - if (!filelists) - { - g_set_error(error,RAZOR_POSIX_ERROR,errno?errno:ENOMEM, - "%s: %s",s,strerror(errno)); - g_free(s); + stream=g_file_read(file,NULL,error); + g_object_unref(file); + if (!stream) return NULL; - } - g_free(s); + decompressor=g_zlib_decompressor_new(G_ZLIB_COMPRESSOR_FORMAT_GZIP); + filelists=g_converter_input_stream_new(G_INPUT_STREAM(stream), + G_CONVERTER(decompressor)); + g_object_unref(stream); + g_object_unref(decompressor); ctx.current_parser=ctx.primary_parser; ctx.current=0; do @@ -367,29 +371,13 @@ case XML_INITIALIZED: buf=XML_GetBuffer(ctx.current_parser,XML_BUFFER_SIZE); if (ctx.current_parser==ctx.primary_parser) - len=gzread(primary,buf,XML_BUFFER_SIZE); + len=g_input_stream_read(G_INPUT_STREAM(primary),buf, + XML_BUFFER_SIZE,NULL,error); else - len=gzread(filelists,buf,XML_BUFFER_SIZE); + len=g_input_stream_read(G_INPUT_STREAM(filelists),buf, + XML_BUFFER_SIZE,NULL,error); if (len<0) - { - if (ctx.current_parser==ctx.primary_parser) - { - errstr=gzerror(primary,&errnum); - errobj="primary.xml.gz"; - } - else - { - errstr=gzerror(filelists,&errnum); - errobj="filelists.xml.gz"; - } - if (errnum==Z_ERRNO) - g_set_error(error,PLOVER_POSIX_ERROR,errno,"%s: %s", - errobj,strerror(errno)); - else - g_set_error(error,RAZOR_ZLIB_ERROR,errnum,"%s: %s", - errobj,errstr); return NULL; - } XML_ParseBuffer(ctx.current_parser,len,!len); break; case XML_FINISHED: @@ -398,8 +386,8 @@ } while (status.parsing!=XML_FINISHED); XML_ParserFree(ctx.primary_parser); XML_ParserFree(ctx.filelists_parser); - gzclose(primary); - gzclose(filelists); + g_object_unref(primary); + g_object_unref(filelists); set=razor_importer_finish(ctx.importer); #if RAZOR_HEADER_VERSION_MIN<=1 /* @@ -415,3 +403,17 @@ #endif return set; } + +struct razor_set *plover_razor_set_create_from_yum(const char *base, + GError **error) +{ + gchar *base_uri; + GFile *file; + struct razor_set *set; + file=g_file_new_for_path(base); + base_uri=g_file_get_uri(file); + g_object_unref(file); + set=plover_razor_set_create_from_yum_uri(base_uri,error); + g_free(base_uri); + return set; +} diff -r 419a02fa70db -r 6b3034a884dc plover/plover.h --- a/plover/plover.h Thu Jun 16 12:11:14 2016 +0100 +++ b/plover/plover.h Thu Jun 16 18:00:21 2016 +0100 @@ -74,6 +74,8 @@ void plover_propagate_razor_error(GError **dest,struct razor_error *src); void plover_propagate_g_error(struct razor_error **dest,GError *src); +struct razor_set *plover_razor_set_create_from_yum_uri(const char *base_uri, + GError **error); struct razor_set *plover_razor_set_create_from_yum(const char *base, GError **error); @@ -90,6 +92,7 @@ int plover_installed_files_match_prefix(const char *prefix); struct comps *plover_comps_new(void); +struct comps *plover_comps_new_from_uri(const char *uri); struct comps *plover_comps_new_from_file(const char *filename); void plover_comps_free(struct comps *comps); struct comps_group *plover_comps_lookup_group(struct comps *comps, diff -r 419a02fa70db -r 6b3034a884dc plover/razor.c --- a/plover/razor.c Thu Jun 16 12:11:14 2016 +0100 +++ b/plover/razor.c Thu Jun 16 18:00:21 2016 +0100 @@ -177,16 +177,30 @@ return 0; } +gboolean plover_install_uri(const char *base_uri,const char *prefix,char **pkgs, + GError **error) +{ + gboolean retval; + PloverTransaction *transaction; + transaction=plover_transaction_new_install_uri(base_uri,prefix,pkgs,error); + if (!transaction) + return FALSE; + retval=plover_transaction_commit(transaction,NULL,error); + g_object_unref(transaction); + return retval; +} + gboolean plover_install(const char *base,const char *prefix,char **pkgs, GError **error) { gboolean retval; - PloverTransaction *transaction; - transaction=plover_transaction_new_install(base,prefix,pkgs,error); - if (!transaction) - return FALSE; - retval=plover_transaction_commit(transaction,NULL,error); - g_object_unref(transaction); + GFile *file; + gchar *base_uri; + file=g_file_new_for_path(base); + base_uri=g_file_get_uri(file); + g_object_unref(file); + retval=plover_install_uri(base_uri,prefix,pkgs,error); + g_free(base_uri); return retval; } diff -r 419a02fa70db -r 6b3034a884dc plover/repository.c --- a/plover/repository.c Thu Jun 16 12:11:14 2016 +0100 +++ b/plover/repository.c Thu Jun 16 18:00:21 2016 +0100 @@ -102,7 +102,7 @@ return g_strconcat(name,"-",v,".",arch,".rpm",NULL); } -PloverRepository *plover_repository_new_from_yum(const char *base, +PloverRepository *plover_repository_new_from_yum_uri(const char *base_uri, GError **error) { char *s; @@ -114,15 +114,9 @@ PloverPackageSet *set; PloverRepository *repository; PloverRepositoryPrivate *priv; - GFile *file; - gchar *uri; - imported=plover_razor_set_create_from_yum(base,error); + imported=plover_razor_set_create_from_yum_uri(base_uri,error); if (!imported) return NULL; - file=g_file_new_for_path(base); - uri=g_file_get_uri(file); - g_object_unref(file); - g_message("Using %s as URI",uri); set=plover_package_set_new_from_razor(imported); razor_set_unref(imported); repository=g_object_new(PLOVER_TYPE_REPOSITORY,NULL); @@ -133,14 +127,27 @@ RAZOR_DETAIL_VERSION,&version,RAZOR_DETAIL_ARCH,&arch,RAZOR_DETAIL_LAST)) { s=rpm_filename(name,version,arch); - g_ptr_array_add(uris,g_build_filename(uri,"rpms",s,NULL)); + g_ptr_array_add(uris,g_build_filename(base_uri,"rpms",s,NULL)); free(s); } razor_package_iterator_destroy(pi); g_ptr_array_add(uris,NULL); priv->uris=(gchar **)g_ptr_array_free(uris,FALSE); priv->set=set; - g_free(uri); + return repository; +} + +PloverRepository *plover_repository_new_from_yum(const char *base, + GError **error) +{ + PloverRepository *repository; + gchar *base_uri; + GFile *file; + file=g_file_new_for_path(base); + base_uri=g_file_get_uri(file); + g_object_unref(file); + repository=plover_repository_new_from_yum_uri(base_uri,error); + g_free(base_uri); return repository; } diff -r 419a02fa70db -r 6b3034a884dc plover/repository.h --- a/plover/repository.h Thu Jun 16 12:11:14 2016 +0100 +++ b/plover/repository.h Thu Jun 16 18:00:21 2016 +0100 @@ -37,6 +37,8 @@ GType plover_repository_get_type(void) G_GNUC_CONST; PloverRepository *plover_repository_new_from_files(const char **filenames, GError **error); +PloverRepository *plover_repository_new_from_yum_uri(const char *base_uri, + GError **error); PloverRepository *plover_repository_new_from_yum(const char *base, GError **error); PloverPackageSet * diff -r 419a02fa70db -r 6b3034a884dc plover/transaction.c --- a/plover/transaction.c Thu Jun 16 12:11:14 2016 +0100 +++ b/plover/transaction.c Thu Jun 16 18:00:21 2016 +0100 @@ -493,14 +493,14 @@ } gboolean - plover_transaction_set_upstream_from_yum(PloverTransaction *transaction, - const char *base,GError **error) + plover_transaction_set_upstream_from_yum_uri(PloverTransaction *transaction, + const char *base_uri,GError **error) { gboolean retval; PloverRepository *upstream; g_return_val_if_fail(PLOVER_IS_TRANSACTION(transaction),FALSE); g_return_val_if_fail(transaction->upstream == NULL,FALSE); - upstream=plover_repository_new_from_yum(base,error); + upstream=plover_repository_new_from_yum_uri(base_uri,error); if (!upstream) return FALSE; retval=plover_transaction_set_upstream(transaction,upstream,error); @@ -508,6 +508,21 @@ return retval; } +gboolean + plover_transaction_set_upstream_from_yum(PloverTransaction *transaction, + const char *base,GError **error) +{ + gboolean retval; + gchar *base_uri; + GFile *file; + file=g_file_new_for_path(base); + base_uri=g_file_get_uri(file); + g_object_unref(file); + retval=plover_transaction_set_upstream_from_yum_uri(transaction,base_uri,error); + g_free(base_uri); + return retval; +} + gboolean plover_transaction_install(PloverTransaction *transaction, char **pkgs,GError **error) { @@ -581,13 +596,13 @@ return TRUE; } -PloverTransaction *plover_transaction_new_install(const char *base, +PloverTransaction *plover_transaction_new_install_uri(const char *base_uri, const char *prefix,char **pkgs,GError **error) { PloverTransaction *transaction; transaction=plover_transaction_new(); plover_transaction_set_prefix(transaction,prefix); - if (!plover_transaction_set_upstream_from_yum(transaction,base,error)) + if (!plover_transaction_set_upstream_from_yum_uri(transaction,base_uri,error)) { g_object_unref(transaction); return NULL; @@ -600,6 +615,20 @@ return transaction; } +PloverTransaction *plover_transaction_new_install(const char *base, + const char *prefix,char **pkgs,GError **error) +{ + PloverTransaction *transaction; + gchar *base_uri; + GFile *file; + file=g_file_new_for_path(base); + base_uri=g_file_get_uri(file); + g_object_unref(file); + transaction=plover_transaction_new_install_uri(base_uri,prefix,pkgs,error); + g_free(base_uri); + return transaction; +} + PloverTransaction *plover_transaction_new_update(const char *base, const char *prefix,char **pkgs,GError **error) { diff -r 419a02fa70db -r 6b3034a884dc plover/transaction.h --- a/plover/transaction.h Thu Jun 16 12:11:14 2016 +0100 +++ b/plover/transaction.h Thu Jun 16 18:00:21 2016 +0100 @@ -52,10 +52,15 @@ gboolean plover_transaction_set_upstream(PloverTransaction *transaction, PloverRepository *upstream,GError **error); gboolean + plover_transaction_set_upstream_from_yum_uri(PloverTransaction *transaction, + const char *base_uri,GError **error); +gboolean plover_transaction_set_upstream_from_yum(PloverTransaction *transaction, const char *base,GError **error); gboolean plover_transaction_install(PloverTransaction *transaction, char **pkgs,GError **error); +PloverTransaction *plover_transaction_new_install_uri(const char *base_uri, + const char *prefix,char **pkgs,GError **error); PloverTransaction *plover_transaction_new_install(const char *base, const char *prefix,char **pkgs,GError **error); gboolean plover_transaction_update(PloverTransaction *transaction, diff -r 419a02fa70db -r 6b3034a884dc tests/plover-gtk/Makefile.am --- a/tests/plover-gtk/Makefile.am Thu Jun 16 12:11:14 2016 +0100 +++ b/tests/plover-gtk/Makefile.am Thu Jun 16 18:00:21 2016 +0100 @@ -3,11 +3,13 @@ LDADD=../../plover-gtk/libplover-gtk.la ../../plover/libplover.la \ $(PLOVER_GTK_LIBS) +TEST_EXTENSIONS = + if HAVE_CHECK_TOOLS TESTS = $(txt_tests) $(gui_tests:=.xvfb) TESTS_ENVIRONMENT = gtk_srcdir="$(top_srcdir)/plover-gtk" -TEST_EXTENSIONS = .xvfb +TEST_EXTENSIONS += .xvfb XVFB_LOG_COMPILER = $(top_srcdir)/tests/xvfb-run XVFB_LOG_FLAGS = --auto-servernum --auth-file .Xauthority diff -r 419a02fa70db -r 6b3034a884dc tests/plover/Makefile.am --- a/tests/plover/Makefile.am Thu Jun 16 12:11:14 2016 +0100 +++ b/tests/plover/Makefile.am Thu Jun 16 18:00:21 2016 +0100 @@ -11,10 +11,32 @@ test_programs = test-import-yum test-package test-repository test-packageset \ test-transaction test-comps test-log test-util test-razor test-vector \ - test-exception-handler + test-exception-handler test-fileio test_transaction_LDADD = $(LDADD) $(LUA_POSIX_LIBS) test_razor_LDADD = $(LDADD) $(LUA_POSIX_LIBS) +test_fileio_SOURCES = test-fileio.c test-fileio-gresource.c +test_fileio_DEPENDENCIES = test-fileio-gresource.h +test_fileio_LDADD = $(LDADD) $(LUA_POSIX_LIBS) + +test-fileio-gresource.c: test-fileio.gresource.xml + $(AM_V_GEN)$(COMPILE_RESOURCES) --target=$@ --generate \ + --sourcedir=../yum-repo-test-dir --manual-register \ + test-fileio.gresource.xml + +test-fileio-gresource.h: test-fileio.gresource.xml + $(AM_V_GEN)$(COMPILE_RESOURCES) --target=$@ --generate \ + --sourcedir=../yum-repo-test-dir --manual-register \ + test-fileio.gresource.xml + +test-fileio.gresource.xml: + $(AM_V_GEN)(cd ../yum-repo-test-dir; \ + echo ''; \ + echo ''; \ + echo ''; \ + find . -type f -print | sed -e 's/^\.\/\(.*\)$$/\1<\/file>/'; \ + echo ''; \ + echo '') > $@ endif @@ -23,3 +45,6 @@ clean-local: rm -rf test-log-rotate razor-test-dir-* + +CLEANFILES = test-fileio-gresource.c test-fileio-gresource.h \ + test-fileio.gresource.xml diff -r 419a02fa70db -r 6b3034a884dc tests/plover/test-fileio.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/plover/test-fileio.c Thu Jun 16 18:00:21 2016 +0100 @@ -0,0 +1,113 @@ +/* + * Copyright (C) 2009, 2011, 2016 J. Ali Harlow + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include +#include +#include +#include +#include +#include "config.h" +#include "plover/plover.h" +#include "test-fileio-gresource.h" + +LUALIB_API int luaopen_posix(lua_State *L); + +void test_resource(void) +{ + gchar *prefix,*root,*root_uri,*s; + int ch,changed; + struct comps *comps; + struct comps_group *group; + struct comps_requirement *pkg; + struct plover_vector *packages=NULL; + GError *error=NULL; + GFile *file; + test_fileio_register_resource(); + root=g_strdup("razor-test-dir-XXXXXX"); + g_assert(mkdtemp(root)); + file=g_file_new_for_path(root); + root_uri=g_file_get_uri(file); + g_object_unref(file); + g_setenv("RAZOR_ROOT",root_uri,TRUE); + g_free(root_uri); + comps=plover_comps_new_from_uri( + "resource:///uk/co/juiblex/project/plover/repodata/comps.xml"); + if (!comps) + { + perror("resource:///uk/co/juiblex/project/plover/repodata/comps.xml"); + exit(1); + } + prefix=plover_default_prefix_for_vendor(comps->vendor); + group=plover_comps_lookup_group(comps,"base"); + if (!group) + { + fprintf(stderr,"No base group found in comps.xml\n"); + exit(1); + } + packages=plover_vector_new(); + do + { + changed=0; + for(pkg=group->packages;pkg;pkg=pkg->next) + { + if (plover_vector_contains(packages,pkg->name)) + continue; + if (pkg->type==COMPS_REQUIREMENT_DEFAULT || + pkg->type==COMPS_REQUIREMENT_MANDATORY || + pkg->type==COMPS_REQUIREMENT_CONDITIONAL && (!pkg->requires || + plover_vector_contains(packages,pkg->requires))) + { + changed++; + plover_vector_append(packages,pkg->name); + } + } + } while(changed); + plover_comps_free(comps); + if (!packages->len) + { + fprintf(stderr,"No packages to install\n"); + exit(1); + } + if (!plover_install_uri("resource:///uk/co/juiblex/project/plover",prefix, + packages->strings,&error)) + { + fprintf(stderr,"%s\n",error->message); + g_error_free(error); + exit(1); + } + plover_vector_free(packages); + g_free(prefix); + g_unsetenv("RAZOR_ROOT"); + test_fileio_unregister_resource(); + s=g_build_filename(root,"usr/bin/zsh",NULL); + g_free(root); + if (!g_file_test(s,G_FILE_TEST_EXISTS)) + g_error("%s: Missing file",s); + g_free(s); +} + +int main(int argc,char **argv) +{ + int retval; + razor_set_lua_loader("posix",(void (*)())luaopen_posix); + g_test_init(&argc,&argv,NULL); + g_test_bug_base("mailto:ali@juiblex.co.uk"); + g_test_add_func("/fileio/resource",test_resource); + retval=g_test_run(); + return retval; +}