|
@@ -23,6 +23,9 @@
|
|
|
#include "qapi/error.h"
|
|
|
#include "qom/object.h"
|
|
|
#include "qemu/module.h"
|
|
|
+#include "qemu/option.h"
|
|
|
+#include "qemu/config-file.h"
|
|
|
+#include "qom/object_interfaces.h"
|
|
|
|
|
|
|
|
|
#define TYPE_DUMMY "qemu-dummy"
|
|
@@ -162,6 +165,10 @@ static const TypeInfo dummy_info = {
|
|
|
.instance_finalize = dummy_finalize,
|
|
|
.class_size = sizeof(DummyObjectClass),
|
|
|
.class_init = dummy_class_init,
|
|
|
+ .interfaces = (InterfaceInfo[]) {
|
|
|
+ { TYPE_USER_CREATABLE },
|
|
|
+ { }
|
|
|
+ }
|
|
|
};
|
|
|
|
|
|
|
|
@@ -320,6 +327,14 @@ static const TypeInfo dummy_backend_info = {
|
|
|
.class_size = sizeof(DummyBackendClass),
|
|
|
};
|
|
|
|
|
|
+static QemuOptsList qemu_object_opts = {
|
|
|
+ .name = "object",
|
|
|
+ .implied_opt_name = "qom-type",
|
|
|
+ .head = QTAILQ_HEAD_INITIALIZER(qemu_object_opts.head),
|
|
|
+ .desc = {
|
|
|
+ { }
|
|
|
+ },
|
|
|
+};
|
|
|
|
|
|
|
|
|
static void test_dummy_createv(void)
|
|
@@ -388,6 +403,46 @@ static void test_dummy_createlist(void)
|
|
|
object_unparent(OBJECT(dobj));
|
|
|
}
|
|
|
|
|
|
+static void test_dummy_createcmdl(void)
|
|
|
+{
|
|
|
+ QemuOpts *opts;
|
|
|
+ DummyObject *dobj;
|
|
|
+ Error *err = NULL;
|
|
|
+ const char *params = TYPE_DUMMY \
|
|
|
+ ",id=dev0," \
|
|
|
+ "bv=yes,sv=Hiss hiss hiss,av=platypus";
|
|
|
+
|
|
|
+ qemu_add_opts(&qemu_object_opts);
|
|
|
+ opts = qemu_opts_parse(&qemu_object_opts, params, true, &err);
|
|
|
+ g_assert(err == NULL);
|
|
|
+ g_assert(opts);
|
|
|
+
|
|
|
+ dobj = DUMMY_OBJECT(user_creatable_add_opts(opts, &err));
|
|
|
+ g_assert(err == NULL);
|
|
|
+ g_assert(dobj);
|
|
|
+ g_assert_cmpstr(dobj->sv, ==, "Hiss hiss hiss");
|
|
|
+ g_assert(dobj->bv == true);
|
|
|
+ g_assert(dobj->av == DUMMY_PLATYPUS);
|
|
|
+
|
|
|
+ user_creatable_del("dev0", &err);
|
|
|
+ g_assert(err == NULL);
|
|
|
+ error_free(err);
|
|
|
+
|
|
|
+ /*
|
|
|
+ * cmdline-parsing via qemu_opts_parse() results in a QemuOpts entry
|
|
|
+ * corresponding to the Object's ID to be added to the QemuOptsList
|
|
|
+ * for objects. To avoid having this entry conflict with future
|
|
|
+ * Objects using the same ID (which can happen in cases where
|
|
|
+ * qemu_opts_parse() is used to parse the object params, such as
|
|
|
+ * with hmp_object_add() at the time of this comment), we need to
|
|
|
+ * check for this in user_creatable_del() and remove the QemuOpts if
|
|
|
+ * it is present.
|
|
|
+ *
|
|
|
+ * The below check ensures this works as expected.
|
|
|
+ */
|
|
|
+ g_assert_null(qemu_opts_find(&qemu_object_opts, "dev0"));
|
|
|
+}
|
|
|
+
|
|
|
static void test_dummy_badenum(void)
|
|
|
{
|
|
|
Error *err = NULL;
|
|
@@ -525,6 +580,7 @@ int main(int argc, char **argv)
|
|
|
|
|
|
g_test_add_func("/qom/proplist/createlist", test_dummy_createlist);
|
|
|
g_test_add_func("/qom/proplist/createv", test_dummy_createv);
|
|
|
+ g_test_add_func("/qom/proplist/createcmdline", test_dummy_createcmdl);
|
|
|
g_test_add_func("/qom/proplist/badenum", test_dummy_badenum);
|
|
|
g_test_add_func("/qom/proplist/getenum", test_dummy_getenum);
|
|
|
g_test_add_func("/qom/proplist/iterator", test_dummy_iterator);
|