diff --git a/test/Makefile.am b/test/Makefile.am index 9d5acdd..52c63dc 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -16,14 +16,17 @@ TESTDATA=4x6.pcf 8x16.pcf out.expected fonts.conf.in AM_CPPFLAGS = -I$(top_srcdir) -I$(top_builddir) +check_PROGRAMS = test-migration if HAVE_PTHREAD -check_PROGRAMS = test-pthread -noinst_PROGRAMS = $(check_PROGRAMS) +check_PROGRAMS += test-pthread test_pthread_LDADD = $(top_builddir)/src/libfontconfig.la # We don't enable this test by default because it will require config and fonts # to meaningfully test anything, and we are not installed yet. #TESTS += test-pthread endif +noinst_PROGRAMS = $(check_PROGRAMS) + +test_migration_LDADD = $(top_builddir)/src/libfontconfig.la EXTRA_DIST=$(check_SCRIPTS) $(TESTDATA) diff --git a/test/test-migration.c b/test/test-migration.c new file mode 100644 index 0000000..a0ab839 --- /dev/null +++ b/test/test-migration.c @@ -0,0 +1,172 @@ +#include +#include +#include +#include +#include +#include +#include + +FcBool +mkdir_p(const char *dir) +{ + char *parent; + FcBool ret; + + if (strlen (dir) == 0) + return FcFalse; + parent = (char *) FcStrDirname (dir); + if (!parent) + return FcFalse; + if (access (parent, F_OK) == 0) + ret = mkdir (dir, 0755) == 0 && chmod (dir, 0755) == 0; + else if (access (parent, F_OK) == -1) + ret = mkdir_p (parent) && (mkdir (dir, 0755) == 0) && chmod (dir, 0755) == 0; + else + ret = FcFalse; + free (parent); + + return ret; +} + +FcBool +unlink_dirs(const char *dir) +{ + DIR *d = opendir (dir); + struct dirent *e; + size_t len = strlen (dir); + char *n = NULL; + FcBool ret = FcTrue; + + if (!d) + return FcFalse; + while ((e = readdir(d)) != NULL) + { + size_t l; + + if (strcmp (e->d_name, ".") == 0 || + strcmp (e->d_name, "..") == 0) + continue; + l = strlen (e->d_name) + 1; + if (n) + free (n); + n = malloc (l + len + 1); + strcpy (n, dir); + n[len] = '/'; + strcpy (&n[len + 1], e->d_name); + if (e->d_type == DT_DIR) + { + if (!unlink_dirs (n)) + { + fprintf (stderr, "E: %s\n", n); + ret = FcFalse; + break; + } + } + else + { + if (unlink (n) == -1) + { + fprintf (stderr, "E: %s\n", n); + ret = FcFalse; + break; + } + } + } + if (n) + free (n); + closedir (d); + + if (rmdir (dir) == -1) + { + fprintf (stderr, "E: %s\n", dir); + return FcFalse; + } + + return ret; +} + +int +main(void) +{ + char template[32] = "fontconfig-XXXXXXXX"; + char *tmp = mkdtemp (template); + size_t len = strlen (tmp), xlen, dlen; + char xdg[256], confd[256], fn[256], nfn[256], ud[256], nud[256]; + int ret = -1; + FILE *fp; + char *content = ""; + + strcpy (xdg, tmp); + strcpy (&xdg[len], "/.config"); + setenv ("HOME", tmp, 1); + setenv ("XDG_CONFIG_HOME", xdg, 1); + xlen = strlen (xdg); + strcpy (confd, xdg); + strcpy (&confd[xlen], "/fontconfig"); + dlen = strlen (confd); + /* In case there are no configuration files nor directory */ + FcInit (); + if (access (confd, F_OK) == 0) + { + fprintf (stderr, "%s unexpectedly exists\n", confd); + goto bail; + } + FcFini (); + if (!unlink_dirs (tmp)) + { + fprintf (stderr, "Unable to clean up\n"); + goto bail; + } + /* In case there are the user configuration file */ + strcpy (fn, tmp); + strcpy (&fn[len], "/.fonts.conf"); + strcpy (nfn, confd); + strcpy (&nfn[dlen], "/fonts.conf"); + if (!mkdir_p (confd)) + { + fprintf (stderr, "Unable to create a config dir: %s\n", confd); + goto bail; + } + if ((fp = fopen (fn, "wb")) == NULL) + { + fprintf (stderr, "Unable to create a config file: %s\n", fn); + goto bail; + } + fwrite (content, sizeof (char), strlen (content), fp); + fclose (fp); + FcInit (); + if (access (nfn, F_OK) != 0) + { + fprintf (stderr, "migration failed for %s\n", nfn); + goto bail; + } + FcFini (); + if (!unlink_dirs (tmp)) + { + fprintf (stderr, "Unable to clean up\n"); + goto bail; + } + /* In case there are the user configuration dir */ + strcpy (ud, tmp); + strcpy (&ud[len], "/.fonts.conf.d"); + strcpy (nud, confd); + strcpy (&nud[dlen], "/conf.d"); + if (!mkdir_p (ud)) + { + fprintf (stderr, "Unable to create a config dir: %s\n", ud); + goto bail; + } + FcInit (); + if (access (nud, F_OK) != 0) + { + fprintf (stderr, "migration failed for %s\n", nud); + goto bail; + } + FcFini (); + + ret = 0; +bail: + unlink_dirs (tmp); + + return ret; +}