diff options
author | Richard Hughes <richard@hughsie.com> | 2014-08-11 22:46:07 +0100 |
---|---|---|
committer | Richard Hughes <richard@hughsie.com> | 2014-08-12 12:28:06 +0100 |
commit | 6594493efcd0befa32f1c1623d22c4ced848272e (patch) | |
tree | 6bf6de788c59ff0c21e3f1c0ab0770f5a42392fe | |
parent | fe47e35691dc5f570077596288b59d967970efe1 (diff) | |
download | appstream-glib-6594493efcd0befa32f1c1623d22c4ced848272e.tar.gz |
Add a self test framework for libappstream-builder
25 files changed, 668 insertions, 3 deletions
diff --git a/data/tests/Makefile.am b/data/tests/Makefile.am index bb8f3e7..0b3e091 100644 --- a/data/tests/Makefile.am +++ b/data/tests/Makefile.am @@ -4,6 +4,8 @@ test_files = \ alpha-internal1.png \ alpha-internal2.png \ alpha-vert.png \ + app-1-1.fc21.x86_64.rpm \ + app-extra-1-1.fc21.noarch.rpm \ broken.appdata.xml \ example.desktop \ example.metainfo.xml \ @@ -14,6 +16,7 @@ test_files = \ screenshot.png \ ss-small.png \ success.appdata.xml \ + test-0.1-1.fc21.noarch.rpm \ translated.appdata.xml \ usr/share/appdata/broken.appdata.xml \ usr/share/app-install/desktop/test.desktop \ @@ -22,6 +25,11 @@ test_files = \ usr/share/pixmaps/test.png \ validate.xml.gz +CLEANFILES = \ + rpmbuild/app.bin \ + rpmbuild/en_GB.mo \ + rpmbuild/ru.mo + EXTRA_DIST = $(test_files) -include $(top_srcdir)/git.mk diff --git a/data/tests/app-1-1.fc21.x86_64.rpm b/data/tests/app-1-1.fc21.x86_64.rpm Binary files differnew file mode 100644 index 0000000..4abbeee --- /dev/null +++ b/data/tests/app-1-1.fc21.x86_64.rpm diff --git a/data/tests/app-extra-1-1.fc21.noarch.rpm b/data/tests/app-extra-1-1.fc21.noarch.rpm Binary files differnew file mode 100644 index 0000000..fb55c28 --- /dev/null +++ b/data/tests/app-extra-1-1.fc21.noarch.rpm diff --git a/data/tests/app.spec b/data/tests/app.spec new file mode 100644 index 0000000..bbd5fe3 --- /dev/null +++ b/data/tests/app.spec @@ -0,0 +1,71 @@ +Summary: A test application +Name: app +Version: 1 +Release: 1%{?dist} +URL: http://people.freedesktop.org/ +License: GPLv2+ +Source0: README +Source1: app.desktop +Source2: app.png +Source3: app.appdata.xml +Source4: search-provider.ini +Source5: index.page +Source6: app-demo.desktop +Source7: app.service +Source8: app.metainfo.xml +Source9: app-extra.metainfo.xml +Source10: app.gir +Source11: en_GB.mo +Source12: ru.mo +Source13: app.notifyrc +Source14: app.bin + +%description +This is a test application. + +%package extra +Summary: Extra plugins for app +Requires: %{name}%{?_isa} = %{version}-%{release} +BuildArch: noarch + +%description extra +Extra plugins to provide new functionality for app. + +%install +install -Dp %{SOURCE0} $RPM_BUILD_ROOT/%{_datadir}/%{name}-%{version}/README +install -Dp %{SOURCE1} $RPM_BUILD_ROOT/%{_datadir}/applications/app.desktop +install -Dp %{SOURCE2} $RPM_BUILD_ROOT/%{_datadir}/pixmaps/app.png +install -Dp %{SOURCE3} $RPM_BUILD_ROOT/%{_datadir}/appdata/app.appdata.xml +install -Dp %{SOURCE4} $RPM_BUILD_ROOT/%{_datadir}/gnome-shell/search-providers/search-provider.ini +install -Dp %{SOURCE5} $RPM_BUILD_ROOT/%{_datadir}/help/C/app/index.page +install -Dp %{SOURCE6} $RPM_BUILD_ROOT/%{_datadir}/applications/app-demo.desktop +install -Dp %{SOURCE7} $RPM_BUILD_ROOT/%{_datadir}/dbus-1/services/app.service +install -Dp %{SOURCE8} $RPM_BUILD_ROOT/%{_datadir}/appdata/app.metainfo.xml +install -Dp %{SOURCE9} $RPM_BUILD_ROOT/%{_datadir}/appdata/app-extra.metainfo.xml +install -Dp %{SOURCE10} $RPM_BUILD_ROOT/%{_datadir}/gir-1.0/app.gir +install -Dp %{SOURCE11} $RPM_BUILD_ROOT/%{_datadir}/locale/en_GB/LC_MESSAGES/app.mo +install -Dp %{SOURCE12} $RPM_BUILD_ROOT/%{_datadir}/locale/ru/LC_MESSAGES/app.mo +install -Dp %{SOURCE13} $RPM_BUILD_ROOT/%{_datadir}/kde4/apps/app/app.notifyrc +install -Dp %{SOURCE14} $RPM_BUILD_ROOT/%{_bindir}/app.bin + +%files +%defattr(-,root,root) +%doc %{_datadir}/%{name}-%{version}/README +%{_bindir}/app.bin +%{_datadir}/appdata/app.*.xml +%{_datadir}/applications/*.desktop +%{_datadir}/dbus-1/services/app.service +%{_datadir}/gir-1.0/app.gir +%{_datadir}/gnome-shell/search-providers/search-provider.ini +%{_datadir}/help/*/app +%{_datadir}/kde4/apps/app/app.notifyrc +%{_datadir}/locale/en_GB/LC_MESSAGES/app.mo +%{_datadir}/locale/ru/LC_MESSAGES/app.mo +%{_datadir}/pixmaps/app.png + +%files extra +%{_datadir}/appdata/app-extra.metainfo.xml + +%changelog +* Tue Aug 12 2014 Richard Hughes <richard@hughsie.com> - 1-1 +- Initial version diff --git a/data/tests/rpmbuild/README b/data/tests/rpmbuild/README new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/data/tests/rpmbuild/README @@ -0,0 +1 @@ + diff --git a/data/tests/rpmbuild/app-demo.desktop b/data/tests/rpmbuild/app-demo.desktop new file mode 100644 index 0000000..9259484 --- /dev/null +++ b/data/tests/rpmbuild/app-demo.desktop @@ -0,0 +1,8 @@ +[Desktop Entry] +Name=App Demo +Comment=A test demo application +Icon=app +Exec=app --demo +Terminal=false +Type=Application +Categories=GNOME;GTK;System;Profiling; diff --git a/data/tests/rpmbuild/app-extra.metainfo.xml b/data/tests/rpmbuild/app-extra.metainfo.xml new file mode 100644 index 0000000..c3d9c72 --- /dev/null +++ b/data/tests/rpmbuild/app-extra.metainfo.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="UTF-8"?> +<component type="addon"> + <id>app-extra</id> + <extends>app.desktop</extends> + <name>Extra</name> + <summary>Addons for extra functionality</summary> + <metadata_license>CC0-1.0</metadata_license> + <project_license>GPL-2.0+</project_license> + <updatecontact>richard_at_hughsie.com</updatecontact> +</component> diff --git a/data/tests/rpmbuild/app.appdata.xml b/data/tests/rpmbuild/app.appdata.xml new file mode 100644 index 0000000..f804735 --- /dev/null +++ b/data/tests/rpmbuild/app.appdata.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="UTF-8"?> +<application> + <id type="desktop">app.desktop</id> + <metadata_license>CC0-1.0</metadata_license> + <project_license>LGPL-2.0+</project_license> + <description> + <p>Long description goes here.</p> + </description> + <screenshots> + <screenshot type="default">http://people.freedesktop.org/~hughsient/appdata/long-description.png</screenshot> + </screenshots> + <url type="homepage">http://people.freedesktop.org/~hughsient/appdata/</url> + <updatecontact>richard_at_hughsie.com</updatecontact> +</application> diff --git a/data/tests/rpmbuild/app.c b/data/tests/rpmbuild/app.c new file mode 100644 index 0000000..67b80d6 --- /dev/null +++ b/data/tests/rpmbuild/app.c @@ -0,0 +1,16 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * Copyright (C) 2014 Richard Hughes <richard@hughsie.com> + * Licensed under the GNU Lesser General Public License Version 2.1 */ + +#include <gtk/gtk.h> + +int +main (int argc, char *argv[]) +{ + GtkApplication *app; + gtk_init (&argc, &argv); + app = gtk_application_new ("org.freedesktop.AppStream", G_APPLICATION_FLAGS_NONE); + gtk_application_get_menu_by_id (app, "not-going-to-exist"); + g_object_unref (app); + return 0; +} diff --git a/data/tests/rpmbuild/app.desktop b/data/tests/rpmbuild/app.desktop new file mode 100644 index 0000000..73b275e --- /dev/null +++ b/data/tests/rpmbuild/app.desktop @@ -0,0 +1,9 @@ +[Desktop Entry] +Name=App +Comment=A test application +Icon=app +Exec=app +Terminal=false +Type=Application +Categories=GNOME;GTK;System;Profiling; +Keywords=Remote;Administration; diff --git a/data/tests/rpmbuild/app.gir b/data/tests/rpmbuild/app.gir new file mode 100644 index 0000000..02c372f --- /dev/null +++ b/data/tests/rpmbuild/app.gir @@ -0,0 +1,7 @@ +<?xml version="1.0"?> +<repository version="1.2" xmlns="http://www.gtk.org/introspection/core/1.0" xmlns:c="http://www.gtk.org/introspection/c/1.0" xmlns:glib="http://www.gtk.org/introspection/glib/1.0"> +<include name="GLib" version="2.0"/> +<include name="Gio" version="2.0"/> +<include name="GObject" version="2.0"/> +<include name="Gtk" version="3.0"/> +</repository> diff --git a/data/tests/rpmbuild/app.metainfo.xml b/data/tests/rpmbuild/app.metainfo.xml new file mode 100644 index 0000000..45f9cb5 --- /dev/null +++ b/data/tests/rpmbuild/app.metainfo.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="UTF-8"?> +<component type="addon"> + <id>app-core</id> + <extends>app.desktop</extends> + <name>Core</name> + <summary>Addons for core functionality</summary> + <metadata_license>CC0-1.0</metadata_license> + <project_license>GPL-2.0+</project_license> + <updatecontact>richard_at_hughsie.com</updatecontact> +</component> diff --git a/data/tests/rpmbuild/app.notifyrc b/data/tests/rpmbuild/app.notifyrc new file mode 100644 index 0000000..88d2c75 --- /dev/null +++ b/data/tests/rpmbuild/app.notifyrc @@ -0,0 +1,3 @@ +[Global] +IconName=app +Comment=App diff --git a/data/tests/rpmbuild/app.png b/data/tests/rpmbuild/app.png Binary files differnew file mode 100644 index 0000000..6234389 --- /dev/null +++ b/data/tests/rpmbuild/app.png diff --git a/data/tests/rpmbuild/app.service b/data/tests/rpmbuild/app.service new file mode 100644 index 0000000..9e1ae60 --- /dev/null +++ b/data/tests/rpmbuild/app.service @@ -0,0 +1,3 @@ +[D-BUS Service] +Name=org.freedesktop.AppStream +Exec=app diff --git a/data/tests/rpmbuild/build.sh b/data/tests/rpmbuild/build.sh new file mode 100755 index 0000000..1949ada --- /dev/null +++ b/data/tests/rpmbuild/build.sh @@ -0,0 +1,4 @@ +msgfmt ru.po -o ru.mo +msgfmt en_GB.po -o en_GB.mo +gcc -o app.bin app.c `pkg-config --cflags --libs gtk+-3.0` +cp * ~/rpmbuild/SOURCES/ && rpmbuild -ba ../app.spec && cp ~/rpmbuild/RPMS/app*.rpm ../ diff --git a/data/tests/rpmbuild/en_GB.po b/data/tests/rpmbuild/en_GB.po new file mode 100644 index 0000000..67eb9f0 --- /dev/null +++ b/data/tests/rpmbuild/en_GB.po @@ -0,0 +1,25 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Richard Hughes <richard@hughsie.com>, 2014. +msgid "" +msgstr "" +"Project-Id-Version: gnome-power-manager\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-08-05 10:10+0100\n" +"PO-Revision-Date: 2011-03-09 19:20+0100\n" +"Last-Translator: Richard Hughes <richard@hughsie.com>\n" +"Language-Team: British English <en@li.org>\n" +"Language: en_GB\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Show extra debugging information" +msgstr "Show extra debugging informations" + +msgid "XXXShow extra debugging information" +msgstr "XXXShow extra debugging informations" diff --git a/data/tests/rpmbuild/index.page b/data/tests/rpmbuild/index.page new file mode 100644 index 0000000..79891d3 --- /dev/null +++ b/data/tests/rpmbuild/index.page @@ -0,0 +1,6 @@ +<page xmlns="http://projectmallard.org/1.0/" + xmlns:its="http://www.w3.org/2005/11/its" + xmlns:e="http://projectmallard.org/experimental/" + type="guide" style="2column task" + id="index"> +</page> diff --git a/data/tests/rpmbuild/ru.po b/data/tests/rpmbuild/ru.po new file mode 100644 index 0000000..757b27e --- /dev/null +++ b/data/tests/rpmbuild/ru.po @@ -0,0 +1,9 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Igor Gnatenko <i.gnatenko.brain@gmail.com>, 2014 + +msgid "Show extra debugging information" +msgstr "Показывать дополнительную отладочную информацию" diff --git a/data/tests/rpmbuild/search-provider.ini b/data/tests/rpmbuild/search-provider.ini new file mode 100644 index 0000000..b3161f6 --- /dev/null +++ b/data/tests/rpmbuild/search-provider.ini @@ -0,0 +1,3 @@ +[Shell Search Provider] +DesktopId=app.desktop +Version=2 diff --git a/data/tests/test-0.1-1.fc21.noarch.rpm b/data/tests/test-0.1-1.fc21.noarch.rpm Binary files differnew file mode 100644 index 0000000..4fb974d --- /dev/null +++ b/data/tests/test-0.1-1.fc21.noarch.rpm diff --git a/data/tests/test.spec b/data/tests/test.spec new file mode 100644 index 0000000..298ce87 --- /dev/null +++ b/data/tests/test.spec @@ -0,0 +1,25 @@ +Summary: Test package +Name: test +Version: 0.1 +Release: 1%{?dist} +URL: http://people.freedesktop.org/~hughsient/ +Source0: README +License: GPLv2+ +BuildArch: noarch +Requires: foo +Requires: bar +Requires: baz + +%description +This is a test package. + +%install +install -Dp %{SOURCE0} $RPM_BUILD_ROOT/%{_datadir}/%{name}-%{version}/README + +%files +%defattr(-,root,root) +%doc %{_datadir}/%{name}-%{version}/README + +%changelog +* Mon May 17 2010 Richard Hughes <richard@hughsie.com> - 0.1-1 +- Initial version diff --git a/libappstream-builder/Makefile.am b/libappstream-builder/Makefile.am index ecf9ce4..ec1b955 100644 --- a/libappstream-builder/Makefile.am +++ b/libappstream-builder/Makefile.am @@ -81,6 +81,19 @@ libappstream_builder_la_LDFLAGS = \ libappstream_builder_la_CFLAGS = \ $(WARNINGFLAGS_C) +check_PROGRAMS = \ + asb-self-test +asb_self_test_SOURCES = \ + asb-self-test.c +asb_self_test_LDADD = \ + $(GLIB_LIBS) \ + $(GDKPIXBUF_LIBS) \ + $(SOUP_LIBS) \ + $(lib_LTLIBRARIES) +asb_self_test_CFLAGS = $(WARNINGFLAGS_C) + +TESTS = asb-self-test + if HAVE_INTROSPECTION introspection_sources = \ asb-app.c \ diff --git a/libappstream-builder/asb-panel.c b/libappstream-builder/asb-panel.c index 3b2c9eb..391d6b6 100644 --- a/libappstream-builder/asb-panel.c +++ b/libappstream-builder/asb-panel.c @@ -50,6 +50,7 @@ struct _AsbPanelPrivate guint number_cleared; guint title_width; guint time_secs_min; + gboolean enabled; }; G_DEFINE_TYPE_WITH_PRIVATE (AsbPanel, asb_panel, G_TYPE_OBJECT) @@ -117,6 +118,13 @@ asb_panel_print (AsbPanel *panel, const gchar *fmt, ...) for (i = str->len; i < priv->line_width_max; i++) g_string_append (str, " "); + /* don't do console cleverness in make check */ + if (!priv->enabled) { + g_debug ("%s", str->str); + priv->line_width_max = str->len - 1; + return; + } + /* is this bigger than anything else we've seen? */ len = asb_panel_print_raw (panel, str->str); if (len - 1 > priv->line_width_max) @@ -164,7 +172,7 @@ asb_panel_refresh (AsbPanel *panel) g_mutex_lock (&priv->mutex); /* clear four lines of blank */ - if (priv->number_cleared < priv->items->len) { + if (priv->enabled && priv->number_cleared < priv->items->len) { for (i = 0; i < priv->items->len + 1; i++) asb_panel_print_raw (panel, "\n"); for (i = 0; i < priv->items->len + 1; i++) @@ -205,8 +213,10 @@ asb_panel_refresh (AsbPanel *panel) } /* go back up to the start */ - for (i = 0; i < priv->number_cleared + 1; i++) - asb_panel_print_raw (panel, "\033[1A"); + if (priv->enabled) { + for (i = 0; i < priv->number_cleared + 1; i++) + asb_panel_print_raw (panel, "\033[1A"); + } g_mutex_unlock (&priv->mutex); } @@ -373,6 +383,9 @@ asb_panel_init (AsbPanel *panel) priv->time_secs_min = G_MAXUINT; g_mutex_init (&priv->mutex); + /* self test fix */ + priv->enabled = g_getenv ("ASB_IS_SELF_TEST") == NULL; + /* find an actual TTY */ priv->tty_fd = open ("/dev/tty", O_RDWR, 0); if (priv->tty_fd < 0) diff --git a/libappstream-builder/asb-self-test.c b/libappstream-builder/asb-self-test.c new file mode 100644 index 0000000..9040d17 --- /dev/null +++ b/libappstream-builder/asb-self-test.c @@ -0,0 +1,407 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * + * Copyright (C) 2014 Richard Hughes <richard@hughsie.com> + * + * Licensed under the GNU Lesser General Public License Version 2.1 + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "config.h" + +#include <glib.h> +#include <stdlib.h> + +#include "as-cleanup.h" + +#include "asb-context-private.h" +#include "asb-plugin.h" +#include "asb-plugin-loader.h" +#include "asb-task.h" +#include "asb-utils.h" + +#ifdef HAVE_RPM +#include "asb-package-rpm.h" +#endif + +/** + * asb_test_get_filename: + **/ +static gchar * +asb_test_get_filename (const gchar *filename) +{ + char full_tmp[PATH_MAX]; + gchar *tmp; + _cleanup_free_ gchar *path = NULL; + + path = g_build_filename (TESTDATADIR, filename, NULL); + tmp = realpath (path, full_tmp); + if (tmp == NULL) + return NULL; + return g_strdup (full_tmp); +} + +#ifdef HAVE_RPM +static void +asb_test_package_rpm_func (void) +{ + AsRelease *rel; + GError *error = NULL; + GPtrArray *releases; + gboolean ret; + gchar *tmp; + _cleanup_free_ gchar *filename = NULL; + _cleanup_object_unref_ AsbPackage *pkg = NULL; + _cleanup_ptrarray_unref_ GPtrArray *glob = NULL; + + /* open file */ + filename = asb_test_get_filename ("test-0.1-1.fc21.noarch.rpm"); + g_assert (filename != NULL); + pkg = asb_package_rpm_new (); + ret = asb_package_open (pkg, filename, &error); + g_assert_no_error (error); + g_assert (ret); + + /* check attributes */ + g_assert (asb_package_get_enabled (pkg)); + g_assert_cmpstr (asb_package_get_filename (pkg), ==, filename); + g_assert_cmpstr (asb_package_get_basename (pkg), ==, "test-0.1-1.fc21.noarch.rpm"); + g_assert_cmpstr (asb_package_get_name (pkg), ==, "test"); + g_assert_cmpstr (asb_package_get_nevr (pkg), ==, "test-0.1-1.fc21"); + g_assert_cmpstr (asb_package_get_evr (pkg), ==, "0.1-1.fc21"); + g_assert_cmpstr (asb_package_get_url (pkg), ==, "http://people.freedesktop.org/~hughsient/"); + g_assert_cmpstr (asb_package_get_license (pkg), ==, "GPL-2.0+"); + g_assert_cmpstr (asb_package_get_source (pkg), ==, "test-0.1-1.fc21"); + g_assert_cmpstr (asb_package_get_source_pkgname (pkg), ==, "test"); + + /* filelists */ + tmp = g_strjoinv (";", asb_package_get_filelist (pkg)); + g_assert_cmpstr (tmp, ==, "/usr/share/test-0.1/README"); + g_free (tmp); + + /* deps */ + tmp = g_strjoinv (";", asb_package_get_deps (pkg)); + g_assert_cmpstr (tmp, ==, "bar;baz;foo"); + g_free (tmp); + + /* releases */ + releases = asb_package_get_releases (pkg); + g_assert_cmpint (releases->len, ==, 1); + rel = g_ptr_array_index (releases, 0); + g_assert (rel != NULL); + g_assert_cmpstr (as_release_get_version (rel), ==, "0.1"); + g_assert_cmpint (as_release_get_timestamp (rel), ==, 1274097600); + g_assert_cmpstr (as_release_get_description (rel, NULL), ==, NULL); + rel = asb_package_get_release (pkg, "0.1"); + g_assert (rel != NULL); + g_assert_cmpint (as_release_get_timestamp (rel), ==, 1274097600); + + /* check config */ + g_assert_cmpstr (asb_package_get_config (pkg, "test"), ==, NULL); + asb_package_set_config (pkg, "test", "dave1"); + g_assert_cmpstr (asb_package_get_config (pkg, "test"), ==, "dave1"); + asb_package_set_config (pkg, "test", "dave2"); + g_assert_cmpstr (asb_package_get_config (pkg, "test"), ==, "dave2"); + + /* compare */ + g_assert_cmpint (asb_package_compare (pkg, pkg), ==, 0); + + /* explode all */ + ret = asb_utils_ensure_exists_and_empty ("/tmp/asb-test", &error); + g_assert_no_error (error); + g_assert (ret); + ret = asb_package_explode (pkg, "/tmp/asb-test", NULL, &error); + g_assert_no_error (error); + g_assert (ret); + g_assert (g_file_test ("/tmp/asb-test/usr/share/test-0.1/README", G_FILE_TEST_EXISTS)); + + /* explode with a glob */ + ret = asb_utils_ensure_exists_and_empty ("/tmp/asb-test", &error); + g_assert_no_error (error); + g_assert (ret); + glob = asb_glob_value_array_new (); + asb_plugin_add_glob (glob, "/usr/share/*"); + ret = asb_package_explode (pkg, "/tmp/asb-test", glob, &error); + g_assert_no_error (error); + g_assert (ret); + g_assert (g_file_test ("/tmp/asb-test/usr/share/test-0.1/README", G_FILE_TEST_EXISTS)); +} +#endif + +static void +asb_test_utils_glob_func (void) +{ + _cleanup_ptrarray_unref_ GPtrArray *array = NULL; + + array = asb_glob_value_array_new (); + g_ptr_array_add (array, asb_glob_value_new ("*.desktop", "DESKTOP")); + g_ptr_array_add (array, asb_glob_value_new ("*.appdata.xml", "APPDATA")); + g_assert_cmpint (array->len, ==, 2); + g_assert_cmpstr (asb_glob_value_search (array, "moo"), ==, NULL); + g_assert_cmpstr (asb_glob_value_search (array, "gimp.desktop"), ==, "DESKTOP"); + g_assert_cmpstr (asb_glob_value_search (array, "gimp.appdata.xml"), ==, "APPDATA"); +} + +static void +asb_test_utils_replace_func (void) +{ + guint n; + _cleanup_string_free_ GString *str = NULL; + + str = g_string_new ("I want to have searched for search"); + n = asb_string_replace (str, "search", "replace"); + g_assert_cmpstr (str->str, ==, "I want to have replaceed for replace"); + g_assert_cmpint (n, ==, 2); +} + +static void +asb_test_plugin_loader_func (void) +{ + AsbPluginLoader *loader = NULL; + AsbPlugin *plugin; + GError *error = NULL; + GPtrArray *plugins; + gboolean ret; + _cleanup_object_unref_ AsbContext *ctx = NULL; + _cleanup_ptrarray_unref_ GPtrArray *globs = NULL; + + /* set up loader */ + ctx = asb_context_new (); + loader = asb_context_get_plugin_loader (ctx); + ret = asb_plugin_loader_setup (loader, &error); + g_assert_no_error (error); + g_assert (ret); + + /* get the list of globs */ + globs = asb_plugin_loader_get_globs (loader); + g_assert_cmpint (globs->len, ==, 22); + g_assert_cmpstr (asb_glob_value_search (globs, "/usr/share/applications/gimp.desktop"), ==, ""); + g_assert_cmpstr (asb_glob_value_search (globs, "/srv/dave.txt"), ==, NULL); + + /* get the list of plugins */ + plugins = asb_plugin_loader_get_plugins (loader); + g_assert_cmpint (plugins->len, ==, 17); + plugin = g_ptr_array_index (plugins, 0); + g_assert (plugin != NULL); + g_assert (plugin->module != NULL); + g_assert (plugin->enabled); + g_assert_cmpstr (plugin->name, ==, "nm"); + g_assert (plugin->ctx == ctx); + + /* match the correct one */ + plugin = asb_plugin_loader_match_fn (loader, "/usr/share/applications/gimp.desktop"); + g_assert (plugin != NULL); + g_assert_cmpstr (plugin->name, ==, "desktop"); +} + +static void +asb_test_context_func (void) +{ +#ifdef HAVE_RPM + AsApp *app; + AsbPackage *pkg; + GError *error = NULL; + const gchar *expected_xml; + gboolean ret; + _cleanup_free_ gchar *filename1 = NULL; + _cleanup_free_ gchar *filename2 = NULL; + _cleanup_free_ gchar *filename3 = NULL; + _cleanup_object_unref_ AsbContext *ctx = NULL; + _cleanup_object_unref_ AsStore *store = NULL; + _cleanup_object_unref_ AsStore *store_failed = NULL; + _cleanup_object_unref_ GFile *file = NULL; + _cleanup_object_unref_ GFile *file_failed = NULL; + _cleanup_string_free_ GString *xml = NULL; + + /* create temp space */ + ret = asb_utils_ensure_exists_and_empty ("/tmp/asbuilder", &error); + g_assert_no_error (error); + g_assert (ret); + ret = asb_utils_ensure_exists_and_empty ("/tmp/asbuilder/icons", &error); + g_assert_no_error (error); + g_assert (ret); + + /* set up the context */ + ctx = asb_context_new (); + g_assert (!asb_context_get_add_cache_id (ctx)); + asb_context_set_max_threads (ctx, 1); + asb_context_set_api_version (ctx, 0.8); + asb_context_set_add_cache_id (ctx, TRUE); + asb_context_set_no_net (ctx, TRUE); + asb_context_set_basename (ctx, "asb-self-test"); + asb_context_set_output_dir (ctx, "/tmp/asbuilder"); + asb_context_set_temp_dir (ctx, "/tmp/asbuilder"); + g_assert (asb_context_get_add_cache_id (ctx)); + g_assert_cmpstr (asb_context_get_temp_dir (ctx), ==, "/tmp/asbuilder"); + ret = asb_context_setup (ctx, &error); + g_assert_no_error (error); + g_assert (ret); + + /* add a console application */ + filename1 = asb_test_get_filename ("test-0.1-1.fc21.noarch.rpm"); + g_assert (filename1 != NULL); + ret = asb_context_add_filename (ctx, filename1, &error); + g_assert_no_error (error); + g_assert (ret); + + /* check we can find it */ + pkg = asb_context_find_by_pkgname (ctx, "test"); + g_assert (pkg != NULL); + g_assert_cmpstr (asb_package_get_nevr (pkg), ==, "test-0.1-1.fc21"); + + /* add another GUI application */ + filename2 = asb_test_get_filename ("app-1-1.fc21.x86_64.rpm"); + g_assert (filename2 != NULL); + ret = asb_context_add_filename (ctx, filename2, &error); + g_assert_no_error (error); + g_assert (ret); + + /* add addons for the GUI application */ + filename3 = asb_test_get_filename ("app-extra-1-1.fc21.noarch.rpm"); + g_assert (filename3 != NULL); + ret = asb_context_add_filename (ctx, filename3, &error); + g_assert_no_error (error); + g_assert (ret); + + /* run the plugins */ + ret = asb_context_process (ctx, &error); + g_assert_no_error (error); + g_assert (ret); + + /* check files created */ + g_assert (g_file_test ("/tmp/asbuilder/asb-self-test.xml.gz", G_FILE_TEST_EXISTS)); + g_assert (g_file_test ("/tmp/asbuilder/asb-self-test-failed.xml.gz", G_FILE_TEST_EXISTS)); + g_assert (g_file_test ("/tmp/asbuilder/asb-self-test-icons.tar.gz", G_FILE_TEST_EXISTS)); + + /* try to find console package */ + g_assert (!asb_context_find_in_cache (ctx, "test-0.1-1.fc21.noarch.rpm")); + + /* try to find GUI package */ + g_assert (!asb_context_find_in_cache (ctx, "app-1-1.fc21.x86_64.rpm")); + + /* load AppStream metadata */ + file = g_file_new_for_path ("/tmp/asbuilder/asb-self-test.xml.gz"); + store = as_store_new (); + ret = as_store_from_file (store, file, NULL, NULL, &error); + g_assert_no_error (error); + g_assert (ret); + g_assert_cmpint (as_store_get_size (store), ==, 2); + app = as_store_get_app_by_pkgname (store, "app"); + g_assert (app != NULL); + app = as_store_get_app_by_id (store, "app.desktop"); + g_assert (app != NULL); + + /* check it matches what we expect */ + xml = as_store_to_xml (store, AS_NODE_TO_XML_FLAG_FORMAT_MULTILINE); + expected_xml = + "<components version=\"0.8\" origin=\"asb-self-test\">\n" + "<component type=\"desktop\">\n" + "<id>app.desktop</id>\n" + "<pkgname>app</pkgname>\n" + "<name>App</name>\n" + "<summary>A test application</summary>\n" + "<description><p>Long description goes here.</p></description>\n" + "<icon type=\"cached\">app.png</icon>\n" + "<categories>\n" + "<category>Profiling</category>\n" + "<category>System</category>\n" + "</categories>\n" + "<keywords>\n" + "<keyword>Administration</keyword>\n" + "<keyword>Remote</keyword>\n" + "</keywords>\n" + "<kudos>\n" + "<kudo>AppMenu</kudo>\n" + "<kudo>ModernToolkit</kudo>\n" + "<kudo>Notifications</kudo>\n" + "<kudo>SearchProvider</kudo>\n" + "<kudo>UserDocs</kudo>\n" + "</kudos>\n" + "<project_license>GPL-2.0+</project_license>\n" + "<url type=\"homepage\">http://people.freedesktop.org/~hughsient/appdata/</url>\n" + "<releases>\n" + "<release version=\"1\" timestamp=\"1407844800\"/>\n" + "</releases>\n" + "<provides>\n" + "<dbus type=\"session\">org.freedesktop.AppStream</dbus>\n" + "</provides>\n" + "<languages>\n" + "<lang percentage=\"100\">en_GB</lang>\n" + "<lang percentage=\"33\">ru</lang>\n" + "</languages>\n" + "<metadata>\n" + "<value key=\"X-CreaterepoAsCacheID\">app-1-1.fc21.x86_64.rpm:1</value>\n" + "</metadata>\n" + "</component>\n" + "<component type=\"addon\">\n" + "<id>app-extra</id>\n" + "<pkgname>app-extra</pkgname>\n" + "<source_pkgname>app</source_pkgname>\n" + "<name>Extra</name>\n" + "<summary>Addons for extra functionality</summary>\n" + "<project_license>GPL-2.0+</project_license>\n" + "<url type=\"homepage\">http://people.freedesktop.org/</url>\n" + "<extends>app.desktop</extends>\n" + "<releases>\n" + "<release version=\"1\" timestamp=\"1407844800\"/>\n" + "</releases>\n" + "<languages>\n" + "<lang percentage=\"100\">en_GB</lang>\n" + "<lang percentage=\"33\">ru</lang>\n" + "</languages>\n" + "<metadata>\n" + "<value key=\"X-CreaterepoAsCacheID\">app-extra-1-1.fc21.noarch.rpm:1</value>\n" + "</metadata>\n" + "</component>\n" + "</components>\n"; + if (g_strcmp0 (xml->str, expected_xml) != 0) + g_warning ("Expected:\n%s\nGot:\n%s", expected_xml, xml->str); + g_assert_cmpstr (xml->str, ==, expected_xml); + + /* load failed metadata */ + file_failed = g_file_new_for_path ("/tmp/asbuilder/asb-self-test-failed.xml.gz"); + store_failed = as_store_new (); + ret = as_store_from_file (store_failed, file_failed, NULL, NULL, &error); + g_assert_no_error (error); + g_assert (ret); + g_assert_cmpint (as_store_get_size (store_failed), ==, 0); + + /* remove temp space */ + ret = asb_utils_rmtree ("/tmp/asbuilder", &error); + g_assert_no_error (error); + g_assert (ret); +#endif +} + +int +main (int argc, char **argv) +{ + g_test_init (&argc, &argv, NULL); + + /* only critical and error are fatal */ + g_log_set_fatal_mask (NULL, G_LOG_LEVEL_ERROR | G_LOG_LEVEL_CRITICAL); + g_setenv ("ASB_IS_SELF_TEST", "", TRUE); + + /* tests go here */ + g_test_add_func ("/AppStreamBuilder/utils{replace}", asb_test_utils_replace_func); + g_test_add_func ("/AppStreamBuilder/utils{glob}", asb_test_utils_glob_func); + g_test_add_func ("/AppStreamBuilder/plugin-loader", asb_test_plugin_loader_func); + g_test_add_func ("/AppStreamBuilder/context", asb_test_context_func); +#ifdef HAVE_RPM + g_test_add_func ("/AppStreamBuilder/package{rpm}", asb_test_package_rpm_func); +#endif + return g_test_run (); +} + |