/*
* Copyright (C) 2009-2012, 2014 Red Hat, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see
*/
#include
static void
test_basic(void)
{
OsinfoFilter *filter = osinfo_filter_new();
OsinfoDevice *dev = osinfo_device_new("e1000");
GList *keys;
GList *values;
g_assert_true(OSINFO_IS_FILTER(filter));
g_assert_true(osinfo_filter_matches(filter, OSINFO_ENTITY(dev)));
osinfo_filter_add_constraint(filter, "class", "network");
keys = osinfo_filter_get_constraint_keys(filter);
g_assert_nonnull(keys);
g_assert_cmpstr(keys->data, ==, "class");
g_assert_null(keys->next);
g_list_free(keys);
osinfo_filter_add_constraint(filter, "class", "audio");
keys = osinfo_filter_get_constraint_keys(filter);
g_assert_nonnull(keys);
g_assert_cmpstr(keys->data, ==, "class");
g_assert_null(keys->next);
g_list_free(keys);
osinfo_filter_add_constraint(filter, "bus", "pci");
keys = osinfo_filter_get_constraint_keys(filter);
g_assert_nonnull(keys);
g_assert_nonnull(keys->next);
g_assert_cmpstr(keys->data, ==, "bus");
g_assert_cmpstr(keys->next->data, ==, "class");
g_assert_null(keys->next->next);
g_list_free(keys);
values = osinfo_filter_get_constraint_values(filter, "bus");
g_assert_nonnull(values);
g_assert_cmpstr(values->data, ==, "pci");
g_assert_null(values->next);
g_list_free(values);
values = osinfo_filter_get_constraint_values(filter, "class");
g_assert_nonnull(values);
g_assert_nonnull(values->next);
g_assert_cmpstr(values->data, ==, "audio");
g_assert_cmpstr(values->next->data, ==, "network");
g_assert_null(values->next->next);
g_list_free(values);
g_object_unref(dev);
g_object_unref(filter);
}
static void
test_filter_single(void)
{
OsinfoFilter *filter = osinfo_filter_new();
OsinfoDevice *dev = osinfo_device_new("e1000");
osinfo_entity_add_param(OSINFO_ENTITY(dev), "bus", "pci");
osinfo_filter_add_constraint(filter, "class", "network");
g_assert_false(osinfo_filter_matches(filter, OSINFO_ENTITY(dev)));
osinfo_entity_add_param(OSINFO_ENTITY(dev), "class", "network");
g_assert_true(osinfo_filter_matches(filter, OSINFO_ENTITY(dev)));
osinfo_filter_clear_constraint(filter, "class");
osinfo_filter_add_constraint(filter, "class", "audio");
g_assert_false(osinfo_filter_matches(filter, OSINFO_ENTITY(dev)));
g_object_unref(dev);
g_object_unref(filter);
}
static void
test_filter_multi(void)
{
OsinfoFilter *filter = osinfo_filter_new();
OsinfoDevice *dev = osinfo_device_new("e1000");
osinfo_entity_add_param(OSINFO_ENTITY(dev), "bus", "pci");
osinfo_filter_add_constraint(filter, "bus", "isa");
g_assert_false(osinfo_filter_matches(filter, OSINFO_ENTITY(dev)));
osinfo_filter_add_constraint(filter, "bus", "pci");
/* XXX is this right ? Multiple values for a filter constraint
* is treated as requiring all constraint values to match, not
* required any to match */
//g_assert_true(osinfo_filter_matches(filter, OSINFO_ENTITY(dev)));
g_assert_false(osinfo_filter_matches(filter, OSINFO_ENTITY(dev)));
osinfo_filter_clear_constraints(filter);
osinfo_filter_add_constraint(filter, "bus", "pci");
g_assert_true(osinfo_filter_matches(filter, OSINFO_ENTITY(dev)));
g_object_unref(dev);
g_object_unref(filter);
}
static void
test_filter_combine(void)
{
OsinfoFilter *filter = osinfo_filter_new();
OsinfoDevice *dev1 = osinfo_device_new("e1000");
OsinfoDevice *dev2 = osinfo_device_new("ne2k");
osinfo_entity_add_param(OSINFO_ENTITY(dev1), "bus", "pci");
osinfo_entity_add_param(OSINFO_ENTITY(dev1), "class", "network");
osinfo_entity_add_param(OSINFO_ENTITY(dev2), "bus", "isa");
osinfo_entity_add_param(OSINFO_ENTITY(dev2), "class", "network");
osinfo_filter_add_constraint(filter, "class", "network");
g_assert_true(osinfo_filter_matches(filter, OSINFO_ENTITY(dev1)));
g_assert_true(osinfo_filter_matches(filter, OSINFO_ENTITY(dev2)));
osinfo_filter_add_constraint(filter, "bus", "isa");
g_assert_false(osinfo_filter_matches(filter, OSINFO_ENTITY(dev1)));
g_assert_true(osinfo_filter_matches(filter, OSINFO_ENTITY(dev2)));
g_object_unref(dev1);
g_object_unref(dev2);
g_object_unref(filter);
}
int
main(int argc, char *argv[])
{
g_test_init(&argc, &argv, NULL);
g_test_add_func("/filter/basic", test_basic);
g_test_add_func("/filter/filter_single", test_filter_single);
g_test_add_func("/filter/filter_multi", test_filter_multi);
g_test_add_func("/filter/filter_combine", test_filter_combine);
/* Upfront so we don't confuse valgrind */
osinfo_device_get_type();
osinfo_filter_get_type();
return g_test_run();
}