summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Hughes <richard@hughsie.com>2014-08-14 13:32:37 +0100
committerRichard Hughes <richard@hughsie.com>2014-08-18 10:43:25 +0100
commitd30bf2c124f132931544695e9469568ae765e27a (patch)
treeda28e6fc967407d84f398f920d2049928f8a146e
parent9c697e6d9241d0a01391d162708d0aa42beee24c (diff)
downloadappstream-glib-d30bf2c124f132931544695e9469568ae765e27a.tar.gz
Add some validation rules for metainfo files
-rw-r--r--data/tests/Makefile.am1
-rw-r--r--data/tests/broken.metainfo.xml6
-rw-r--r--libappstream-glib/as-app-validate.c24
-rw-r--r--libappstream-glib/as-self-test.c43
4 files changed, 74 insertions, 0 deletions
diff --git a/data/tests/Makefile.am b/data/tests/Makefile.am
index 8ec67b3..363abeb 100644
--- a/data/tests/Makefile.am
+++ b/data/tests/Makefile.am
@@ -5,6 +5,7 @@ test_files = \
alpha-internal2.png \
alpha-vert.png \
broken.appdata.xml \
+ broken.metainfo.xml \
example.appdata.xml \
example.desktop \
example.metainfo.xml \
diff --git a/data/tests/broken.metainfo.xml b/data/tests/broken.metainfo.xml
new file mode 100644
index 0000000..5e565b6
--- /dev/null
+++ b/data/tests/broken.metainfo.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright 2014 Richard Hughes <richard@hughsie.com> -->
+<component type="addon">
+ <id>gedit-code-assistance</id>
+ <pkgname>gedit-code-assistance</pkgname>
+</component>
diff --git a/libappstream-glib/as-app-validate.c b/libappstream-glib/as-app-validate.c
index 6f54255..7e307ec 100644
--- a/libappstream-glib/as-app-validate.c
+++ b/libappstream-glib/as-app-validate.c
@@ -1080,6 +1080,22 @@ as_app_validate (AsApp *app, AsAppValidateFlags flags, GError **error)
}
}
+ /* pkgname */
+ if (as_app_get_pkgname_default (app) != NULL &&
+ as_app_get_source_kind (app) == AS_APP_SOURCE_KIND_METAINFO) {
+ ai_app_validate_add (probs,
+ AS_PROBLEM_KIND_TAG_INVALID,
+ "<pkgname> not allowed in metainfo");
+ }
+
+ /* extends */
+ if (as_app_get_extends(app)->len == 0 &&
+ as_app_get_source_kind (app) == AS_APP_SOURCE_KIND_METAINFO) {
+ ai_app_validate_add (probs,
+ AS_PROBLEM_KIND_TAG_MISSING,
+ "<extends> is not present");
+ }
+
/* updatecontact */
update_contact = as_app_get_update_contact (app);
if (g_strcmp0 (update_contact,
@@ -1189,6 +1205,10 @@ as_app_validate (AsApp *app, AsAppValidateFlags flags, GError **error)
AS_PROBLEM_KIND_STYLE_INCORRECT,
"<name> requires sentence case");
}
+ } else if (as_app_get_source_kind (app) == AS_APP_SOURCE_KIND_METAINFO) {
+ ai_app_validate_add (probs,
+ AS_PROBLEM_KIND_TAG_MISSING,
+ "<name> is not present");
}
/* comment */
@@ -1221,6 +1241,10 @@ as_app_validate (AsApp *app, AsAppValidateFlags flags, GError **error)
AS_PROBLEM_KIND_STYLE_INCORRECT,
"<summary> requires sentence case");
}
+ } else if (as_app_get_source_kind (app) == AS_APP_SOURCE_KIND_METAINFO) {
+ ai_app_validate_add (probs,
+ AS_PROBLEM_KIND_TAG_MISSING,
+ "<summary> is not present");
}
if (summary != NULL && name != NULL &&
strlen (summary) < strlen (name)) {
diff --git a/libappstream-glib/as-self-test.c b/libappstream-glib/as-self-test.c
index cf9dfce..adea0a1 100644
--- a/libappstream-glib/as-self-test.c
+++ b/libappstream-glib/as-self-test.c
@@ -886,6 +886,48 @@ as_test_app_validate_file_bad_func (void)
}
static void
+as_test_app_validate_meta_bad_func (void)
+{
+ AsProblem *problem;
+ GError *error = NULL;
+ gboolean ret;
+ guint i;
+ _cleanup_free_ gchar *filename = NULL;
+ _cleanup_object_unref_ AsApp *app = NULL;
+ _cleanup_ptrarray_unref_ GPtrArray *probs = NULL;
+
+ /* open file */
+ app = as_app_new ();
+ filename = as_test_get_filename ("broken.metainfo.xml");
+ ret = as_app_parse_file (app, filename, AS_APP_PARSE_FLAG_NONE, &error);
+ g_assert_no_error (error);
+ g_assert (ret);
+
+ probs = as_app_validate (app, AS_APP_VALIDATE_FLAG_NONE, &error);
+ g_assert_no_error (error);
+ g_assert (probs != NULL);
+ for (i = 0; i < probs->len; i++) {
+ problem = g_ptr_array_index (probs, i);
+ g_debug ("%s", as_problem_get_message (problem));
+ }
+ g_assert_cmpint (probs->len, ==, 7);
+ as_test_app_validate_check (probs, AS_PROBLEM_KIND_TAG_MISSING,
+ "<name> is not present");
+ as_test_app_validate_check (probs, AS_PROBLEM_KIND_TAG_MISSING,
+ "<summary> is not present");
+ as_test_app_validate_check (probs, AS_PROBLEM_KIND_TAG_MISSING,
+ "<url> is not present");
+ as_test_app_validate_check (probs, AS_PROBLEM_KIND_TAG_MISSING,
+ "<updatecontact> is not present");
+ as_test_app_validate_check (probs, AS_PROBLEM_KIND_TAG_MISSING,
+ "<extends> is not present");
+ as_test_app_validate_check (probs, AS_PROBLEM_KIND_TAG_MISSING,
+ "<metadata_license> is not present");
+ as_test_app_validate_check (probs, AS_PROBLEM_KIND_TAG_INVALID,
+ "<pkgname> not allowed in metainfo");
+}
+
+static void
as_test_store_local_app_install_func (void)
{
AsApp *app;
@@ -2358,6 +2400,7 @@ main (int argc, char **argv)
g_test_add_func ("/AppStream/app{validate-appdata-good}", as_test_app_validate_appdata_good_func);
g_test_add_func ("/AppStream/app{validate-metainfo-good}", as_test_app_validate_metainfo_good_func);
g_test_add_func ("/AppStream/app{validate-file-bad}", as_test_app_validate_file_bad_func);
+ g_test_add_func ("/AppStream/app{validate-meta-bad}", as_test_app_validate_meta_bad_func);
g_test_add_func ("/AppStream/app{validate-intltool}", as_test_app_validate_intltool_func);
g_test_add_func ("/AppStream/app{parse-file}", as_test_app_parse_file_func);
g_test_add_func ("/AppStream/app{no-markup}", as_test_app_no_markup_func);