| 
									
										
										
										
											2015-10-01 10:59:56 +02:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Device introspection test cases | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Copyright (c) 2015 Red Hat Inc. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Authors: | 
					
						
							|  |  |  |  *  Markus Armbruster <armbru@redhat.com>, | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This work is licensed under the terms of the GNU GPL, version 2 or later. | 
					
						
							|  |  |  |  * See the COPYING file in the top-level directory. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * Covers QMP device-list-properties and HMP device_add help.  We | 
					
						
							|  |  |  |  * currently don't check that their output makes sense, only that QEMU | 
					
						
							|  |  |  |  * survives.  Useful since we've had an astounding number of crash | 
					
						
							|  |  |  |  * bugs around here. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-08 18:08:51 +00:00
										 |  |  | #include "qemu/osdep.h"
 | 
					
						
							| 
									
										
										
										
											2015-10-01 10:59:56 +02:00
										 |  |  | #include "qemu-common.h"
 | 
					
						
							|  |  |  | #include "qapi/qmp/qstring.h"
 | 
					
						
							| 
									
										
										
										
											2016-12-12 16:31:01 -02:00
										 |  |  | #include "qapi/qmp/qdict.h"
 | 
					
						
							| 
									
										
										
										
											2018-02-01 12:18:38 +01:00
										 |  |  | #include "qapi/qmp/qlist.h"
 | 
					
						
							| 
									
										
										
										
											2015-10-01 10:59:56 +02:00
										 |  |  | #include "libqtest.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const char common_args[] = "-nodefaults -machine none"; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-12 16:31:01 -02:00
										 |  |  | static QList *qom_list_types(const char *implements, bool abstract) | 
					
						
							| 
									
										
										
										
											2015-10-01 10:59:56 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     QDict *resp; | 
					
						
							|  |  |  |     QList *ret; | 
					
						
							| 
									
										
										
										
											2016-12-12 16:31:01 -02:00
										 |  |  |     QDict *args = qdict_new(); | 
					
						
							| 
									
										
										
										
											2015-10-01 10:59:56 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-27 16:58:17 -05:00
										 |  |  |     qdict_put_bool(args, "abstract", abstract); | 
					
						
							| 
									
										
										
										
											2016-12-12 16:31:01 -02:00
										 |  |  |     if (implements) { | 
					
						
							| 
									
										
										
										
											2017-04-27 16:58:17 -05:00
										 |  |  |         qdict_put_str(args, "implements", implements); | 
					
						
							| 
									
										
										
										
											2016-12-12 16:31:01 -02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-10-01 10:59:56 +02:00
										 |  |  |     resp = qmp("{'execute': 'qom-list-types'," | 
					
						
							| 
									
										
										
										
											2016-12-12 16:31:01 -02:00
										 |  |  |                " 'arguments': %p }", args); | 
					
						
							| 
									
										
										
										
											2015-10-01 10:59:56 +02:00
										 |  |  |     g_assert(qdict_haskey(resp, "return")); | 
					
						
							|  |  |  |     ret = qdict_get_qlist(resp, "return"); | 
					
						
							| 
									
										
										
										
											2018-04-19 17:01:43 +02:00
										 |  |  |     qobject_ref(ret); | 
					
						
							|  |  |  |     qobject_unref(resp); | 
					
						
							| 
									
										
										
										
											2015-10-01 10:59:56 +02:00
										 |  |  |     return ret; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-07 09:22:15 -03:00
										 |  |  | /* Build a name -> ObjectTypeInfo index from a ObjectTypeInfo list */ | 
					
						
							|  |  |  | static QDict *qom_type_index(QList *types) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QDict *index = qdict_new(); | 
					
						
							|  |  |  |     QListEntry *e; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QLIST_FOREACH_ENTRY(types, e) { | 
					
						
							| 
									
										
										
										
											2018-02-24 16:40:29 +01:00
										 |  |  |         QDict *d = qobject_to(QDict, qlist_entry_obj(e)); | 
					
						
							| 
									
										
										
										
											2017-07-07 09:22:15 -03:00
										 |  |  |         const char *name = qdict_get_str(d, "name"); | 
					
						
							| 
									
										
										
										
											2018-04-19 17:01:43 +02:00
										 |  |  |         qobject_ref(d); | 
					
						
							| 
									
										
										
										
											2017-07-07 09:22:15 -03:00
										 |  |  |         qdict_put(index, name, d); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return index; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Check if @parent is present in the parent chain of @type */ | 
					
						
							|  |  |  | static bool qom_has_parent(QDict *index, const char *type, const char *parent) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     while (type) { | 
					
						
							|  |  |  |         QDict *d = qdict_get_qdict(index, type); | 
					
						
							|  |  |  |         const char *p = d && qdict_haskey(d, "parent") ? | 
					
						
							|  |  |  |                         qdict_get_str(d, "parent") : | 
					
						
							|  |  |  |                         NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (!strcmp(type, parent)) { | 
					
						
							|  |  |  |             return true; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         type = p; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return false; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-07 09:22:13 -03:00
										 |  |  | /* Find an entry on a list returned by qom-list-types */ | 
					
						
							|  |  |  | static QDict *type_list_find(QList *types, const char *name) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QListEntry *e; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QLIST_FOREACH_ENTRY(types, e) { | 
					
						
							| 
									
										
										
										
											2018-02-24 16:40:29 +01:00
										 |  |  |         QDict *d = qobject_to(QDict, qlist_entry_obj(e)); | 
					
						
							| 
									
										
										
										
											2017-07-07 09:22:13 -03:00
										 |  |  |         const char *ename = qdict_get_str(d, "name"); | 
					
						
							|  |  |  |         if (!strcmp(ename, name)) { | 
					
						
							|  |  |  |             return d; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return NULL; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-12 16:31:01 -02:00
										 |  |  | static QList *device_type_list(bool abstract) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return qom_list_types("device", abstract); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-01 10:59:56 +02:00
										 |  |  | static void test_one_device(const char *type) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QDict *resp; | 
					
						
							| 
									
										
										
										
											2018-08-16 13:35:56 +02:00
										 |  |  |     char *help; | 
					
						
							|  |  |  |     char *qom_tree_start, *qom_tree_end; | 
					
						
							|  |  |  |     char *qtree_start, *qtree_end; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     g_test_message("Testing device '%s'", type); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     qom_tree_start = hmp("info qom-tree"); | 
					
						
							|  |  |  |     qtree_start = hmp("info qtree"); | 
					
						
							| 
									
										
										
										
											2015-10-01 10:59:56 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-01 10:59:57 +02:00
										 |  |  |     resp = qmp("{'execute': 'device-list-properties'," | 
					
						
							|  |  |  |                " 'arguments': {'typename': %s}}", | 
					
						
							|  |  |  |                type); | 
					
						
							| 
									
										
										
										
											2018-04-19 17:01:43 +02:00
										 |  |  |     qobject_unref(resp); | 
					
						
							| 
									
										
										
										
											2015-10-01 10:59:56 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     help = hmp("device_add \"%s,help\"", type); | 
					
						
							|  |  |  |     g_free(help); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /*
 | 
					
						
							|  |  |  |      * Some devices leave dangling pointers in QOM behind. | 
					
						
							| 
									
										
										
										
											2018-08-16 13:35:56 +02:00
										 |  |  |      * "info qom-tree" or "info qtree" have a good chance at crashing then. | 
					
						
							|  |  |  |      * Also make sure that the tree did not change. | 
					
						
							| 
									
										
										
										
											2015-10-01 10:59:56 +02:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2018-08-16 13:35:56 +02:00
										 |  |  |     qom_tree_end = hmp("info qom-tree"); | 
					
						
							|  |  |  |     g_assert_cmpstr(qom_tree_start, ==, qom_tree_end); | 
					
						
							|  |  |  |     g_free(qom_tree_start); | 
					
						
							|  |  |  |     g_free(qom_tree_end); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     qtree_end = hmp("info qtree"); | 
					
						
							|  |  |  |     g_assert_cmpstr(qtree_start, ==, qtree_end); | 
					
						
							|  |  |  |     g_free(qtree_start); | 
					
						
							|  |  |  |     g_free(qtree_end); | 
					
						
							| 
									
										
										
										
											2015-10-01 10:59:56 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void test_device_intro_list(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QList *types; | 
					
						
							|  |  |  |     char *help; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     qtest_start(common_args); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     types = device_type_list(true); | 
					
						
							| 
									
										
										
										
											2018-04-19 17:01:43 +02:00
										 |  |  |     qobject_unref(types); | 
					
						
							| 
									
										
										
										
											2015-10-01 10:59:56 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     help = hmp("device_add help"); | 
					
						
							|  |  |  |     g_free(help); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     qtest_end(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-07 09:22:15 -03:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Ensure all entries returned by qom-list-types implements=<parent> | 
					
						
							|  |  |  |  * have <parent> as a parent. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | static void test_qom_list_parents(const char *parent) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QList *types; | 
					
						
							|  |  |  |     QListEntry *e; | 
					
						
							|  |  |  |     QDict *index; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     types = qom_list_types(parent, true); | 
					
						
							|  |  |  |     index = qom_type_index(types); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QLIST_FOREACH_ENTRY(types, e) { | 
					
						
							| 
									
										
										
										
											2018-02-24 16:40:29 +01:00
										 |  |  |         QDict *d = qobject_to(QDict, qlist_entry_obj(e)); | 
					
						
							| 
									
										
										
										
											2017-07-07 09:22:15 -03:00
										 |  |  |         const char *name = qdict_get_str(d, "name"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         g_assert(qom_has_parent(index, name, parent)); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-19 17:01:43 +02:00
										 |  |  |     qobject_unref(types); | 
					
						
							|  |  |  |     qobject_unref(index); | 
					
						
							| 
									
										
										
										
											2017-07-07 09:22:15 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-07 09:22:14 -03:00
										 |  |  | static void test_qom_list_fields(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QList *all_types; | 
					
						
							|  |  |  |     QList *non_abstract; | 
					
						
							|  |  |  |     QListEntry *e; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     qtest_start(common_args); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     all_types = qom_list_types(NULL, true); | 
					
						
							|  |  |  |     non_abstract = qom_list_types(NULL, false); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QLIST_FOREACH_ENTRY(all_types, e) { | 
					
						
							| 
									
										
										
										
											2018-02-24 16:40:29 +01:00
										 |  |  |         QDict *d = qobject_to(QDict, qlist_entry_obj(e)); | 
					
						
							| 
									
										
										
										
											2017-07-07 09:22:14 -03:00
										 |  |  |         const char *name = qdict_get_str(d, "name"); | 
					
						
							|  |  |  |         bool abstract = qdict_haskey(d, "abstract") ? | 
					
						
							|  |  |  |                         qdict_get_bool(d, "abstract") : | 
					
						
							|  |  |  |                         false; | 
					
						
							|  |  |  |         bool expected_abstract = !type_list_find(non_abstract, name); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         g_assert(abstract == expected_abstract); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-07 09:22:15 -03:00
										 |  |  |     test_qom_list_parents("object"); | 
					
						
							|  |  |  |     test_qom_list_parents("device"); | 
					
						
							|  |  |  |     test_qom_list_parents("sys-bus-device"); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-19 17:01:43 +02:00
										 |  |  |     qobject_unref(all_types); | 
					
						
							|  |  |  |     qobject_unref(non_abstract); | 
					
						
							| 
									
										
										
										
											2017-07-07 09:22:14 -03:00
										 |  |  |     qtest_end(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-01 10:59:56 +02:00
										 |  |  | static void test_device_intro_none(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     qtest_start(common_args); | 
					
						
							|  |  |  |     test_one_device("nonexistent"); | 
					
						
							|  |  |  |     qtest_end(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void test_device_intro_abstract(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     qtest_start(common_args); | 
					
						
							|  |  |  |     test_one_device("device"); | 
					
						
							|  |  |  |     qtest_end(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-16 13:35:57 +02:00
										 |  |  | static void test_device_intro_concrete(const void *args) | 
					
						
							| 
									
										
										
										
											2015-10-01 10:59:56 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     QList *types; | 
					
						
							|  |  |  |     QListEntry *entry; | 
					
						
							|  |  |  |     const char *type; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-16 13:35:57 +02:00
										 |  |  |     qtest_start(args); | 
					
						
							| 
									
										
										
										
											2015-10-01 10:59:56 +02:00
										 |  |  |     types = device_type_list(false); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QLIST_FOREACH_ENTRY(types, entry) { | 
					
						
							| 
									
										
										
										
											2018-02-24 16:40:29 +01:00
										 |  |  |         type = qdict_get_try_str(qobject_to(QDict, qlist_entry_obj(entry)), | 
					
						
							|  |  |  |                                  "name"); | 
					
						
							| 
									
										
										
										
											2015-10-01 10:59:56 +02:00
										 |  |  |         g_assert(type); | 
					
						
							|  |  |  |         test_one_device(type); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-19 17:01:43 +02:00
										 |  |  |     qobject_unref(types); | 
					
						
							| 
									
										
										
										
											2015-10-01 10:59:56 +02:00
										 |  |  |     qtest_end(); | 
					
						
							| 
									
										
										
										
											2018-08-16 13:35:57 +02:00
										 |  |  |     g_free((void *)args); | 
					
						
							| 
									
										
										
										
											2015-10-01 10:59:56 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-12 16:31:01 -02:00
										 |  |  | static void test_abstract_interfaces(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QList *all_types; | 
					
						
							| 
									
										
										
										
											2017-07-07 09:22:13 -03:00
										 |  |  |     QListEntry *e; | 
					
						
							| 
									
										
										
										
											2017-07-07 09:22:15 -03:00
										 |  |  |     QDict *index; | 
					
						
							| 
									
										
										
										
											2016-12-12 16:31:01 -02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     qtest_start(common_args); | 
					
						
							| 
									
										
										
										
											2017-07-07 09:22:15 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-07 09:22:14 -03:00
										 |  |  |     all_types = qom_list_types("interface", true); | 
					
						
							| 
									
										
										
										
											2017-07-07 09:22:15 -03:00
										 |  |  |     index = qom_type_index(all_types); | 
					
						
							| 
									
										
										
										
											2016-12-12 16:31:01 -02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-07 09:22:13 -03:00
										 |  |  |     QLIST_FOREACH_ENTRY(all_types, e) { | 
					
						
							| 
									
										
										
										
											2018-02-24 16:40:29 +01:00
										 |  |  |         QDict *d = qobject_to(QDict, qlist_entry_obj(e)); | 
					
						
							| 
									
										
										
										
											2017-07-07 09:22:15 -03:00
										 |  |  |         const char *name = qdict_get_str(d, "name"); | 
					
						
							| 
									
										
										
										
											2017-07-07 09:22:13 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-07 09:22:15 -03:00
										 |  |  |         /*
 | 
					
						
							|  |  |  |          * qom-list-types implements=interface returns all types | 
					
						
							|  |  |  |          * that implement _any_ interface (not just interface | 
					
						
							|  |  |  |          * types), so skip the ones that don't have "interface" | 
					
						
							|  |  |  |          * on the parent type chain. | 
					
						
							|  |  |  |          */ | 
					
						
							|  |  |  |         if (!qom_has_parent(index, name, "interface")) { | 
					
						
							| 
									
										
										
										
											2017-07-07 09:22:14 -03:00
										 |  |  |             /* Not an interface type */ | 
					
						
							|  |  |  |             continue; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2016-12-12 16:31:01 -02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-07 09:22:14 -03:00
										 |  |  |         g_assert(qdict_haskey(d, "abstract") && qdict_get_bool(d, "abstract")); | 
					
						
							| 
									
										
										
										
											2016-12-12 16:31:01 -02:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-19 17:01:43 +02:00
										 |  |  |     qobject_unref(all_types); | 
					
						
							|  |  |  |     qobject_unref(index); | 
					
						
							| 
									
										
										
										
											2016-12-12 16:31:01 -02:00
										 |  |  |     qtest_end(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-16 13:35:57 +02:00
										 |  |  | static void add_machine_test_case(const char *mname) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     char *path, *args; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* Ignore blacklisted machines */ | 
					
						
							|  |  |  |     if (g_str_equal("xenfv", mname) || g_str_equal("xenpv", mname)) { | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     path = g_strdup_printf("device/introspect/concrete/defaults/%s", mname); | 
					
						
							|  |  |  |     args = g_strdup_printf("-M %s", mname); | 
					
						
							|  |  |  |     qtest_add_data_func(path, args, test_device_intro_concrete); | 
					
						
							|  |  |  |     g_free(path); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     path = g_strdup_printf("device/introspect/concrete/nodefaults/%s", mname); | 
					
						
							|  |  |  |     args = g_strdup_printf("-nodefaults -M %s", mname); | 
					
						
							|  |  |  |     qtest_add_data_func(path, args, test_device_intro_concrete); | 
					
						
							|  |  |  |     g_free(path); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-01 10:59:56 +02:00
										 |  |  | int main(int argc, char **argv) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     g_test_init(&argc, &argv, NULL); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     qtest_add_func("device/introspect/list", test_device_intro_list); | 
					
						
							| 
									
										
										
										
											2017-07-07 09:22:14 -03:00
										 |  |  |     qtest_add_func("device/introspect/list-fields", test_qom_list_fields); | 
					
						
							| 
									
										
										
										
											2015-10-01 10:59:56 +02:00
										 |  |  |     qtest_add_func("device/introspect/none", test_device_intro_none); | 
					
						
							|  |  |  |     qtest_add_func("device/introspect/abstract", test_device_intro_abstract); | 
					
						
							| 
									
										
										
										
											2016-12-12 16:31:01 -02:00
										 |  |  |     qtest_add_func("device/introspect/abstract-interfaces", test_abstract_interfaces); | 
					
						
							| 
									
										
										
										
											2018-08-16 13:35:57 +02:00
										 |  |  |     if (g_test_quick()) { | 
					
						
							|  |  |  |         qtest_add_data_func("device/introspect/concrete/defaults/none", | 
					
						
							|  |  |  |                             g_strdup(common_args), test_device_intro_concrete); | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |         qtest_cb_for_every_machine(add_machine_test_case, true); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-10-01 10:59:56 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return g_test_run(); | 
					
						
							|  |  |  | } |