diff options
author | Richard Hughes <richard@hughsie.com> | 2014-08-14 13:32:37 +0100 |
---|---|---|
committer | Richard Hughes <richard@hughsie.com> | 2014-08-18 10:43:25 +0100 |
commit | d30bf2c124f132931544695e9469568ae765e27a (patch) | |
tree | da28e6fc967407d84f398f920d2049928f8a146e | |
parent | 9c697e6d9241d0a01391d162708d0aa42beee24c (diff) | |
download | appstream-glib-d30bf2c124f132931544695e9469568ae765e27a.tar.gz |
Add some validation rules for metainfo files
-rw-r--r-- | data/tests/Makefile.am | 1 | ||||
-rw-r--r-- | data/tests/broken.metainfo.xml | 6 | ||||
-rw-r--r-- | libappstream-glib/as-app-validate.c | 24 | ||||
-rw-r--r-- | libappstream-glib/as-self-test.c | 43 |
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); |