summaryrefslogtreecommitdiff
path: root/test/test-entity.c
diff options
context:
space:
mode:
Diffstat (limited to 'test/test-entity.c')
-rw-r--r--test/test-entity.c297
1 files changed, 297 insertions, 0 deletions
diff --git a/test/test-entity.c b/test/test-entity.c
new file mode 100644
index 0000000..6197864
--- /dev/null
+++ b/test/test-entity.c
@@ -0,0 +1,297 @@
+#include <stdlib.h>
+#include <osinfo/osinfo.h>
+#include <check.h>
+
+/* OsinfoEntity is abstract, so we need to trivially subclass it to test it */
+typedef struct _OsinfoDummy OsinfoDummy;
+typedef struct _OsinfoDummyClass OsinfoDummyClass;
+
+struct _OsinfoDummy
+{
+ OsinfoEntity parent_instance;
+};
+
+struct _OsinfoDummyClass
+{
+ OsinfoEntityClass parent_class;
+};
+
+GType osinfo_dummy_get_type(void);
+
+G_DEFINE_TYPE (OsinfoDummy, osinfo_dummy, OSINFO_TYPE_ENTITY);
+
+static void osinfo_dummy_class_init(OsinfoDummyClass *klass G_GNUC_UNUSED){}
+static void osinfo_dummy_init (OsinfoDummy *self G_GNUC_UNUSED) {}
+
+
+START_TEST(test_id)
+{
+ OsinfoEntity *ent = g_object_new(osinfo_dummy_get_type(), "id", "myentity", NULL);
+ gchar *id;
+
+ fail_unless(g_strcmp0(osinfo_entity_get_id(ent), "myentity") == 0,
+ "Entity id was not 'myentity'");
+
+ g_object_get(ent, "id", &id, NULL);
+ fail_unless(g_strcmp0(id, "myentity") == 0,
+ "Entity id was not 'myentity'");
+ g_free(id);
+
+ g_object_unref(ent);
+}
+END_TEST
+
+START_TEST(test_empty_props)
+{
+ OsinfoEntity *ent = g_object_new(osinfo_dummy_get_type(), "id", "myentity", NULL);
+
+ GList *keys = osinfo_entity_get_param_keys(ent);
+ fail_unless(keys == NULL, "Entity param key list was not empty");
+
+ const gchar *value = osinfo_entity_get_param_value(ent, "wibble");
+ fail_unless(value == NULL, "Entity param value was not NULL");
+
+ GList *values = osinfo_entity_get_param_value_list(ent, "wibble");
+ fail_unless(values == NULL, "Entity param value list was not NULL");
+
+ g_object_unref(ent);
+}
+END_TEST
+
+START_TEST(test_single_prop_value)
+{
+ OsinfoEntity *ent = g_object_new(osinfo_dummy_get_type(), "id", "myentity", NULL);
+
+ osinfo_entity_add_param(ent, "hello", "world");
+
+ GList *keys = osinfo_entity_get_param_keys(ent);
+ fail_unless(keys != NULL, "Entity param key list was empty");
+ fail_unless(keys->next == NULL, "Entity param key list has too many values");
+ fail_unless(g_strcmp0(keys->data, "hello") == 0, "Entity param key was not 'hello'");
+ g_list_free(keys);
+
+ const gchar *value = osinfo_entity_get_param_value(ent, "hello");
+ fail_unless(g_strcmp0(value, "world") == 0, "Entity param value was not 'world'");
+ value = osinfo_entity_get_param_value(ent, "world");
+ fail_unless(value == NULL, "Entity param bogus value was not NULL");
+
+ GList *values = osinfo_entity_get_param_value_list(ent, "hello");
+ fail_unless(values != NULL, "Entity param value list was empty");
+ fail_unless(values->next == NULL, "Entity param value list has too many values");
+ fail_unless(g_strcmp0(values->data, "world") == 0, "Entity param list value was not 'world'");
+
+ g_object_unref(ent);
+}
+END_TEST
+
+START_TEST(test_multi_prop_value)
+{
+ OsinfoEntity *ent = g_object_new(osinfo_dummy_get_type(), "id", "myentity", NULL);
+
+ osinfo_entity_add_param(ent, "hello", "world");
+ osinfo_entity_add_param(ent, "hello", "fred");
+ osinfo_entity_add_param(ent, "hello", "elephant");
+
+ GList *keys = osinfo_entity_get_param_keys(ent);
+ fail_unless(keys != NULL, "Entity param key list was empty");
+ fail_unless(keys->next == NULL, "Entity param key list has too many values");
+ fail_unless(g_strcmp0(keys->data, "hello") == 0, "Entity param key was not 'hello'");
+ g_list_free(keys);
+
+ const gchar *value = osinfo_entity_get_param_value(ent, "hello");
+ fail_unless(g_strcmp0(value, "world") == 0, "Entity param value was not 'world'");
+ value = osinfo_entity_get_param_value(ent, "world");
+ fail_unless(value == NULL, "Entity param bogus value was not NULL");
+
+ GList *values = osinfo_entity_get_param_value_list(ent, "hello");
+ fail_unless(values != NULL, "Entity param value list was empty");
+ fail_unless(values->next != NULL, "Entity param value list doesn't have enough values");
+ fail_unless(values->next->next != NULL, "Entity param value list doesn't have enough values");
+ fail_unless(values->next->next->next == NULL, "Entity param value list has too many values");
+ fail_unless(g_strcmp0(values->data, "world") == 0, "Entity param list first value was not 'world'");
+ fail_unless(g_strcmp0(values->next->data, "fred") == 0, "Entity param list second value was not 'fred'");
+ fail_unless(g_strcmp0(values->next->next->data, "elephant") == 0, "Entity param list third was not 'elephant'");
+
+ g_object_unref(ent);
+}
+END_TEST
+
+START_TEST(test_multi_props)
+{
+ OsinfoEntity *ent = g_object_new(osinfo_dummy_get_type(), "id", "myentity", NULL);
+
+ osinfo_entity_add_param(ent, "hello", "world");
+ osinfo_entity_add_param(ent, "fish", "food");
+ osinfo_entity_add_param(ent, "kevin", "bacon");
+
+ GList *keys = osinfo_entity_get_param_keys(ent);
+ GList *tmp = keys;
+ gboolean foundHello = FALSE;
+ gboolean foundFish = FALSE;
+ gboolean foundKevin = FALSE;
+ gboolean foundBad = FALSE;
+ while (tmp) {
+ if (g_strcmp0(tmp->data, "hello") == 0)
+ foundHello = TRUE;
+ else if (g_strcmp0(tmp->data, "fish") == 0)
+ foundFish = TRUE;
+ else if (g_strcmp0(tmp->data, "kevin") == 0)
+ foundKevin = TRUE;
+ else
+ foundBad = TRUE;
+ tmp = tmp->next;
+ }
+ fail_unless(foundHello, "Entity param key list was missing 'hello'");
+ fail_unless(foundFish, "Entity param key list was missing 'fish'");
+ fail_unless(foundKevin, "Entity param key list was missing 'kevin'");
+ fail_unless(!foundBad, "Entity param key list has unexpected key");
+ g_list_free(keys);
+
+ const gchar *value = osinfo_entity_get_param_value(ent, "hello");
+ fail_unless(g_strcmp0(value, "world") == 0, "Entity param value was not 'world'");
+ value = osinfo_entity_get_param_value(ent, "fish");
+ fail_unless(g_strcmp0(value, "food") == 0, "Entity param value was not 'food'");
+ value = osinfo_entity_get_param_value(ent, "kevin");
+ fail_unless(g_strcmp0(value, "bacon") == 0, "Entity param value was not 'bacon'");
+
+ GList *values = osinfo_entity_get_param_value_list(ent, "hello");
+ fail_unless(values != NULL, "Entity param value list was empty");
+ fail_unless(values->next == NULL, "Entity param value list has too many values");
+ fail_unless(g_strcmp0(values->data, "world") == 0, "Entity param list value was not 'world'");
+
+ values = osinfo_entity_get_param_value_list(ent, "fish");
+ fail_unless(values != NULL, "Entity param value list was empty");
+ fail_unless(values->next == NULL, "Entity param value list has too many values");
+ fail_unless(g_strcmp0(values->data, "food") == 0, "Entity param list value was not 'food'");
+
+ values = osinfo_entity_get_param_value_list(ent, "kevin");
+ fail_unless(values != NULL, "Entity param value list was empty");
+ fail_unless(values->next == NULL, "Entity param value list has too many values");
+ fail_unless(g_strcmp0(values->data, "bacon") == 0, "Entity param list value was not 'bacon'");
+
+ g_object_unref(ent);
+}
+END_TEST
+
+
+START_TEST(test_multi_props_clear)
+{
+ OsinfoEntity *ent = g_object_new(osinfo_dummy_get_type(), "id", "myentity", NULL);
+
+ osinfo_entity_add_param(ent, "hello", "world");
+ osinfo_entity_add_param(ent, "fish", "food");
+
+ GList *keys = osinfo_entity_get_param_keys(ent);
+ GList *tmp = keys;
+ gboolean foundHello = FALSE;
+ gboolean foundFish = FALSE;
+ gboolean foundBad = FALSE;
+ while (tmp) {
+ if (g_strcmp0(tmp->data, "hello") == 0)
+ foundHello = TRUE;
+ else if (g_strcmp0(tmp->data, "fish") == 0)
+ foundFish = TRUE;
+ else
+ foundBad = TRUE;
+ tmp = tmp->next;
+ }
+ fail_unless(foundHello, "Entity param key list was missing 'hello'");
+ fail_unless(foundFish, "Entity param key list was missing 'fish'");
+ fail_unless(!foundBad, "Entity param key list has unexpected key");
+ g_list_free(keys);
+
+ const gchar *value = osinfo_entity_get_param_value(ent, "hello");
+ fail_unless(g_strcmp0(value, "world") == 0, "Entity param value was not 'world'");
+ value = osinfo_entity_get_param_value(ent, "fish");
+ fail_unless(g_strcmp0(value, "food") == 0, "Entity param value was not 'food'");
+
+ osinfo_entity_clear_param(ent, "hello");
+
+ keys = osinfo_entity_get_param_keys(ent);
+ tmp = keys;
+ foundHello = FALSE;
+ foundFish = FALSE;
+ foundBad = FALSE;
+ while (tmp) {
+ if (g_strcmp0(tmp->data, "hello") == 0)
+ foundHello = TRUE;
+ else if (g_strcmp0(tmp->data, "fish") == 0)
+ foundFish = TRUE;
+ else
+ foundBad = TRUE;
+ tmp = tmp->next;
+ }
+ fail_unless(!foundHello, "Entity param key list has unexpected 'hello'");
+ fail_unless(foundFish, "Entity param key list was missing 'fish'");
+ fail_unless(!foundBad, "Entity param key list has unexpected key");
+ g_list_free(keys);
+
+ value = osinfo_entity_get_param_value(ent, "hello");
+ fail_unless(g_strcmp0(value, NULL) == 0, "Entity param value was not removed");
+ value = osinfo_entity_get_param_value(ent, "fish");
+ fail_unless(g_strcmp0(value, "food") == 0, "Entity param value was not 'food'");
+
+ osinfo_entity_add_param(ent, "hello", "world");
+ osinfo_entity_clear_param(ent, "fish");
+
+ keys = osinfo_entity_get_param_keys(ent);
+ tmp = keys;
+ foundHello = FALSE;
+ foundFish = FALSE;
+ foundBad = FALSE;
+ while (tmp) {
+ if (g_strcmp0(tmp->data, "hello") == 0)
+ foundHello = TRUE;
+ else if (g_strcmp0(tmp->data, "fish") == 0)
+ foundFish = TRUE;
+ else
+ foundBad = TRUE;
+ tmp = tmp->next;
+ }
+ fail_unless(foundHello, "Entity param key list has unexpected 'hello'");
+ fail_unless(!foundFish, "Entity param key list was missing 'fish'");
+ fail_unless(!foundBad, "Entity param key list has unexpected key");
+ g_list_free(keys);
+
+ value = osinfo_entity_get_param_value(ent, "hello");
+ fail_unless(g_strcmp0(value, "world") == 0, "Entity param value was not readded");
+ value = osinfo_entity_get_param_value(ent, "fish");
+ fail_unless(g_strcmp0(value, NULL) == 0, "Entity param value was not removed");
+
+ g_object_unref(ent);
+}
+END_TEST
+
+
+static Suite *
+entity_suite(void)
+{
+ Suite *s = suite_create("Entity");
+ TCase *tc = tcase_create("Core");
+ tcase_add_test(tc, test_id);
+ tcase_add_test(tc, test_empty_props);
+ tcase_add_test(tc, test_single_prop_value);
+ tcase_add_test(tc, test_multi_prop_value);
+ tcase_add_test(tc, test_multi_props);
+ tcase_add_test(tc, test_multi_props_clear);
+ suite_add_tcase(s, tc);
+ return s;
+}
+
+int main(void)
+{
+ int number_failed;
+ Suite *s = entity_suite ();
+ SRunner *sr = srunner_create (s);
+
+ g_type_init();
+
+ /* Upfront so we don't confuse valgrind */
+ osinfo_dummy_get_type();
+
+ srunner_run_all (sr, CK_ENV);
+ number_failed = srunner_ntests_failed (sr);
+ srunner_free (sr);
+
+ return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
+}