As devices are inherited from entries that "derives-from" or "clones" any other entries, there's not reason to keep declaring them in several places. By adding this test, hopefully there'll be no more devices duplication from now on. https://bugzilla.redhat.com/show_bug.cgi?id=1634807 Signed-off-by: Fabiano Fidêncio <fidencio@xxxxxxxxxx> --- tests/Makefile.am | 2 +- tests/test-os.c | 144 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 145 insertions(+), 1 deletion(-) diff --git a/tests/Makefile.am b/tests/Makefile.am index 06f81bf..4612f69 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -60,7 +60,7 @@ test_product_SOURCES = test-product.c test_os_LDADD = $(COMMON_LDADD) test_os_CFLAGS = $(COMMON_CFLAGS) -test_os_SOURCES = test-os.c +test_os_SOURCES = test-os.c ../osinfo/osinfo_product.c test_productfilter_LDADD = $(COMMON_LDADD) test_productfilter_CFLAGS = $(COMMON_CFLAGS) diff --git a/tests/test-os.c b/tests/test-os.c index 2ec7960..7085074 100644 --- a/tests/test-os.c +++ b/tests/test-os.c @@ -21,6 +21,7 @@ #include <config.h> #include <osinfo/osinfo.h> +#include "osinfo/osinfo_product_private.h" @@ -188,15 +189,158 @@ test_device_driver(void) } +static GList *get_all_distros(OsinfoOsList *oslist) +{ + GList *oses; + GList *distros = NULL; + + oses = osinfo_list_get_elements(OSINFO_LIST(oslist)); + for (GList *it = oses; it != NULL; it = it->next) { + OsinfoOs *os; + const gchar *distro; + + os = OSINFO_OS(it->data); + distro = osinfo_os_get_distro(os); + + if (g_list_find_custom(distros, distro, (GCompareFunc) g_strcmp0) == NULL) + distros = g_list_prepend(distros, (gchar *)distro); + } + + g_list_free(oses); + + return distros; +} + + +static void check_duplicated_devices_cb(OsinfoProduct *product, + gpointer user_data) +{ + OsinfoOs *os = OSINFO_OS(user_data); + OsinfoOs *foreach_os = OSINFO_OS(product); + OsinfoDeviceList *devices_os, *devices_foreach_os; + GList *list_devices = NULL, *list_foreach_devices = NULL, *list_duplicated = NULL; + + if (os == foreach_os) + return; + + devices_os = osinfo_os_get_devices(os, NULL); + devices_foreach_os = osinfo_os_get_devices(foreach_os, NULL); + + if (osinfo_list_get_length(OSINFO_LIST(devices_os)) == 0 || + osinfo_list_get_length(OSINFO_LIST(devices_foreach_os)) == 0) + goto done; + + list_devices = osinfo_list_get_elements(OSINFO_LIST(devices_os)); + list_foreach_devices = osinfo_list_get_elements(OSINFO_LIST(devices_foreach_os)); + + for (GList *l = list_devices; l != NULL; l = l->next) { + OsinfoDevice *d = OSINFO_DEVICE(l->data); + + for (GList *ll = list_foreach_devices; ll != NULL; ll = ll->next) { + OsinfoDevice *dd = OSINFO_DEVICE(ll->data); + if (d == dd) + list_duplicated = g_list_prepend(list_duplicated, d); + } + } + + if (list_duplicated != NULL) { + gchar *string = NULL; + for (GList *l = list_duplicated; l != NULL; l = l->next) { + gchar *tmp = NULL; + if (string != NULL) + tmp = g_strdup_printf("%s\n - %s\n", + string, + osinfo_device_get_name(OSINFO_DEVICE(l->data))); + else + tmp = g_strdup_printf("\n - %s", + osinfo_device_get_name(OSINFO_DEVICE(l->data))); + + g_free(string); + string = tmp; + } + + g_debug("\nTesting \"%s\" against \"%s\" and found the following duplicated devices: %s", + osinfo_product_get_short_id(OSINFO_PRODUCT(os)), + osinfo_product_get_short_id(product), + string); + g_free(string); + + g_test_fail(); + } + + done: + g_list_free(list_duplicated); + g_list_free(list_devices); + g_list_free(list_foreach_devices); + g_object_unref(devices_os); + g_object_unref(devices_foreach_os); +} + + +static void check_duplicated_devices(OsinfoOs *os) +{ + osinfo_product_foreach_related(OSINFO_PRODUCT(os), + OSINFO_PRODUCT_FOREACH_FLAG_DERIVES_FROM | + OSINFO_PRODUCT_FOREACH_FLAG_CLONES, + check_duplicated_devices_cb, + os); +} + + +static void test_devices_duplication(void) +{ + OsinfoLoader *loader = osinfo_loader_new(); + OsinfoDb *db = osinfo_loader_get_db(loader); + OsinfoOsList *all_oses_list; + GList *distros; + GError *error = NULL; + + g_assert_true(OSINFO_IS_LOADER(loader)); + g_assert_true(OSINFO_IS_DB(db)); + + osinfo_loader_process_default_path(loader, &error); + g_assert_no_error(error); + + all_oses_list = osinfo_db_get_os_list(db); + distros = get_all_distros(all_oses_list); + + for (GList *l = distros; l != NULL; l = l->next) { + const gchar *distro; + OsinfoOsList *oslist; + OsinfoFilter *filter; + + distro = l->data; + + filter = osinfo_filter_new(); + osinfo_filter_add_constraint(filter, OSINFO_OS_PROP_DISTRO, distro); + oslist = OSINFO_OSLIST(osinfo_list_new_filtered(OSINFO_LIST(all_oses_list), filter)); + + for (int i = 0; i < osinfo_list_get_length(OSINFO_LIST(oslist)); i++) { + OsinfoOs *os = OSINFO_OS(osinfo_list_get_nth(OSINFO_LIST(oslist), i)); + check_duplicated_devices(os); + } + + g_object_unref(filter); + g_object_unref(oslist); + } + + g_list_free(distros); + g_object_unref(all_oses_list); + g_object_unref(loader); +} + + int main(int argc, char *argv[]) { g_test_init(&argc, &argv, NULL); + g_test_set_nonfatal_assertions(); g_test_add_func("/os/basic", test_basic); g_test_add_func("/os/loader", test_loader); g_test_add_func("/os/devices", test_devices); g_test_add_func("/os/devices_filter", test_devices_filter); + g_test_add_func("/os/devices_duplication", test_devices_duplication); g_test_add_func("/os/device_driver", test_device_driver); /* Upfront so we don't confuse valgrind */ -- 2.19.1 _______________________________________________ Libosinfo mailing list Libosinfo@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libosinfo