summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Hughes <richard@hughsie.com>2014-08-11 22:46:07 +0100
committerRichard Hughes <richard@hughsie.com>2014-08-12 12:28:06 +0100
commit6594493efcd0befa32f1c1623d22c4ced848272e (patch)
tree6bf6de788c59ff0c21e3f1c0ab0770f5a42392fe
parentfe47e35691dc5f570077596288b59d967970efe1 (diff)
downloadappstream-glib-6594493efcd0befa32f1c1623d22c4ced848272e.tar.gz
Add a self test framework for libappstream-builder
-rw-r--r--data/tests/Makefile.am8
-rw-r--r--data/tests/app-1-1.fc21.x86_64.rpmbin0 -> 13420 bytes
-rw-r--r--data/tests/app-extra-1-1.fc21.noarch.rpmbin0 -> 6636 bytes
-rw-r--r--data/tests/app.spec71
-rw-r--r--data/tests/rpmbuild/README1
-rw-r--r--data/tests/rpmbuild/app-demo.desktop8
-rw-r--r--data/tests/rpmbuild/app-extra.metainfo.xml10
-rw-r--r--data/tests/rpmbuild/app.appdata.xml14
-rw-r--r--data/tests/rpmbuild/app.c16
-rw-r--r--data/tests/rpmbuild/app.desktop9
-rw-r--r--data/tests/rpmbuild/app.gir7
-rw-r--r--data/tests/rpmbuild/app.metainfo.xml10
-rw-r--r--data/tests/rpmbuild/app.notifyrc3
-rw-r--r--data/tests/rpmbuild/app.pngbin0 -> 146 bytes
-rw-r--r--data/tests/rpmbuild/app.service3
-rwxr-xr-xdata/tests/rpmbuild/build.sh4
-rw-r--r--data/tests/rpmbuild/en_GB.po25
-rw-r--r--data/tests/rpmbuild/index.page6
-rw-r--r--data/tests/rpmbuild/ru.po9
-rw-r--r--data/tests/rpmbuild/search-provider.ini3
-rw-r--r--data/tests/test-0.1-1.fc21.noarch.rpmbin0 -> 6352 bytes
-rw-r--r--data/tests/test.spec25
-rw-r--r--libappstream-builder/Makefile.am13
-rw-r--r--libappstream-builder/asb-panel.c19
-rw-r--r--libappstream-builder/asb-self-test.c407
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
new file mode 100644
index 0000000..4abbeee
--- /dev/null
+++ b/data/tests/app-1-1.fc21.x86_64.rpm
Binary files differ
diff --git a/data/tests/app-extra-1-1.fc21.noarch.rpm b/data/tests/app-extra-1-1.fc21.noarch.rpm
new file mode 100644
index 0000000..fb55c28
--- /dev/null
+++ b/data/tests/app-extra-1-1.fc21.noarch.rpm
Binary files differ
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
new file mode 100644
index 0000000..6234389
--- /dev/null
+++ b/data/tests/rpmbuild/app.png
Binary files differ
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
new file mode 100644
index 0000000..4fb974d
--- /dev/null
+++ b/data/tests/test-0.1-1.fc21.noarch.rpm
Binary files differ
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 ();
+}
+