From nobody Wed Apr 24 21:03:23 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1593429892; cv=none; d=zohomail.com; s=zohoarc; b=d5yum70Bdpc9x9rMu4bpXy0AvzJOR1KBigheaRnVo1WYKCMWnfwCsxk5G69opAq2yV3bM1B9RMjHxr5/vAVaouSsqsq25JaxFgalnUI61cH87v5I3NI2UVzvNmrPx7iKRMDTouCsIuCK7qeWv0njUkKRrGrJNxUXfRJot/6NdRM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1593429892; h=Content-Type:Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=JxlH3jUzaEepf5LtvSndn0Zz0abjXTIM81hezRsiWa0=; b=GPjJHSE399ZkK2J2NGWTXq+FCsSwFhF4+bal1mCOcCGrLbjAiobc6+S2GME9HQsLxRqNhdKIAmofnNeLKccGKqxULgWFnmpKGWeCU1Pd8/iGKLmUx312IGQHUVKCbDTKhYwLTaioXyeTH96lS6IeWJIHnNteZ4kpno3ww3w8vds= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1593429892129507.3374188634019; Mon, 29 Jun 2020 04:24:52 -0700 (PDT) Received: from localhost ([::1]:38164 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jpru6-0002xu-S8 for importer@patchew.org; Mon, 29 Jun 2020 07:24:50 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:48558) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jprt6-0001cs-Dy for qemu-devel@nongnu.org; Mon, 29 Jun 2020 07:23:48 -0400 Received: from us-smtp-delivery-1.mimecast.com ([205.139.110.120]:21555 helo=us-smtp-1.mimecast.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1jprt4-0002II-F0 for qemu-devel@nongnu.org; Mon, 29 Jun 2020 07:23:48 -0400 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-4-kOKYBeUmNsqJzv0C9OUYzA-1; Mon, 29 Jun 2020 07:23:43 -0400 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 028CD107ACCD; Mon, 29 Jun 2020 11:23:43 +0000 (UTC) Received: from laptop.redhat.com (ovpn-114-197.ams2.redhat.com [10.36.114.197]) by smtp.corp.redhat.com (Postfix) with ESMTP id 7718F5D9E7; Mon, 29 Jun 2020 11:23:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1593429825; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=JxlH3jUzaEepf5LtvSndn0Zz0abjXTIM81hezRsiWa0=; b=F4Mve+AAYFBu1Q9CBFyiAqzXchC4m+0B8zPe6PFawbVxADZbX9a0CdzM4Z5GgQP2WoGeuh FESIjHpeX+gZ1QXbP4SnGe3Te07FeKSWcfRuVQntRj1UkiN5SEjVLluBOKzEZYqJCx3nt2 0c61Lozd1Qwq8iB5LVDFhTd8iyhhqF8= X-MC-Unique: kOKYBeUmNsqJzv0C9OUYzA-1 From: Eric Auger To: eric.auger.pro@gmail.com, eric.auger@redhat.com, qemu-devel@nongnu.org, pbonzini@redhat.com, berrange@redhat.com, ehabkost@redhat.com, armbru@redhat.com Subject: [PATCH v4 1/3] qom: Introduce object_property_try_add_child() Date: Mon, 29 Jun 2020 13:23:27 +0200 Message-Id: <20200629112329.27611-2-eric.auger@redhat.com> In-Reply-To: <20200629112329.27611-1-eric.auger@redhat.com> References: <20200629112329.27611-1-eric.auger@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=eric.auger@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=205.139.110.120; envelope-from=eric.auger@redhat.com; helo=us-smtp-1.mimecast.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/06/29 01:10:03 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -30 X-Spam_score: -3.1 X-Spam_bar: --- X-Spam_report: (-3.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-1, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=-0.01, RCVD_IN_MSPIKE_WL=-0.01, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=_AUTOLEARN X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" object_property_add() does not allow object_property_try_add() to gracefully fail as &error_abort is passed as an error handle. However such failure can easily be triggered from the QMP shell when, for instance, one attempts to create an object with an id that already exists. This is achieved from the following call path: qmp_object_add -> user_creatable_add_dict -> user_creatable_add_type -> object_property_add_child -> object_property_add For instance, from the qmp-shell, call twice: object-add qom-type=3Dmemory-backend-ram id=3Dmem1 props.size=3D1073741824 and QEMU aborts. This behavior is undesired as a user/management application mistake in reusing a property ID shouldn't result in loss of the VM and live data within. This patch introduces a new function, object_property_try_add_child() which takes an error handle and turn object_property_try_add() into a non-static one. Now the call path becomes: user_creatable_add_type -> object_property_try_add_child -> object_property_try_add and the error is returned gracefully to the QMP client. (QEMU) object-add qom-type=3Dmemory-backend-ram id=3Dmem2 props.size=3D429= 4967296 {"return": {}} (QEMU) object-add qom-type=3Dmemory-backend-ram id=3Dmem2 props.size=3D429= 4967296 {"error": {"class": "GenericError", "desc": "attempt to add duplicate prope= rty 'mem2' to object (type 'container')"}} Signed-off-by: Eric Auger Fixes: d2623129a7de ("qom: Drop parameter @errp of object_property_add() & = friends") Reviewed-by: Markus Armbruster --- v3 -> v4: - Took into account Markus' style related comments v2 -> v3: - don't take the object reference on failure in object_property_try_add_child --- include/qom/object.h | 26 ++++++++++++++++++++++++-- qom/object.c | 21 ++++++++++++++++----- qom/object_interfaces.c | 7 +++++-- 3 files changed, 45 insertions(+), 9 deletions(-) diff --git a/include/qom/object.h b/include/qom/object.h index 94a61ccc3f..1c5cdcd0e3 100644 --- a/include/qom/object.h +++ b/include/qom/object.h @@ -1039,7 +1039,7 @@ Object *object_ref(Object *obj); void object_unref(Object *obj); =20 /** - * object_property_add: + * object_property_try_add: * @obj: the object to add a property to * @name: the name of the property. This can contain any character except= for * a forward slash. In general, you should use hyphens '-' instead of @@ -1056,10 +1056,23 @@ void object_unref(Object *obj); * meant to allow a property to free its opaque upon object * destruction. This may be NULL. * @opaque: an opaque pointer to pass to the callbacks for the property + * @errp: pointer to error object * * Returns: The #ObjectProperty; this can be used to set the @resolve * callback for child and link properties. */ +ObjectProperty *object_property_try_add(Object *obj, const char *name, + const char *type, + ObjectPropertyAccessor *get, + ObjectPropertyAccessor *set, + ObjectPropertyRelease *release, + void *opaque, Error **errp); + +/** + * object_property_add: + * Same as object_property_try_add() with @errp hardcoded to + * &error_abort. + */ ObjectProperty *object_property_add(Object *obj, const char *name, const char *type, ObjectPropertyAccessor *get, @@ -1495,10 +1508,11 @@ Object *object_resolve_path_type(const char *path, = const char *typename, Object *object_resolve_path_component(Object *parent, const char *part); =20 /** - * object_property_add_child: + * object_property_try_add_child: * @obj: the object to add a property to * @name: the name of the property * @child: the child object + * @errp: pointer to error object * * Child properties form the composition tree. All objects need to be a c= hild * of another object. Objects can only be a child of one object. @@ -1512,6 +1526,14 @@ Object *object_resolve_path_component(Object *parent= , const char *part); * * Returns: The newly added property on success, or %NULL on failure. */ +ObjectProperty *object_property_try_add_child(Object *obj, const char *nam= e, + Object *child, Error **errp); + +/** + * object_property_add_child: + * Same as object_property_try_add_child() with @errp hardcoded to + * &error_abort + */ ObjectProperty *object_property_add_child(Object *obj, const char *name, Object *child); =20 diff --git a/qom/object.c b/qom/object.c index 6ece96bc2b..dc10bb1889 100644 --- a/qom/object.c +++ b/qom/object.c @@ -1132,7 +1132,7 @@ void object_unref(Object *obj) } } =20 -static ObjectProperty * +ObjectProperty * object_property_try_add(Object *obj, const char *name, const char *type, ObjectPropertyAccessor *get, ObjectPropertyAccessor *set, @@ -1651,8 +1651,8 @@ static void object_finalize_child_property(Object *ob= j, const char *name, } =20 ObjectProperty * -object_property_add_child(Object *obj, const char *name, - Object *child) +object_property_try_add_child(Object *obj, const char *name, + Object *child, Error **errp) { g_autofree char *type =3D NULL; ObjectProperty *op; @@ -1661,14 +1661,25 @@ object_property_add_child(Object *obj, const char *= name, =20 type =3D g_strdup_printf("child<%s>", object_get_typename(child)); =20 - op =3D object_property_add(obj, name, type, object_get_child_property,= NULL, - object_finalize_child_property, child); + op =3D object_property_try_add(obj, name, type, object_get_child_prope= rty, + NULL, object_finalize_child_property, + child, errp); + if (!op) { + return NULL; + } op->resolve =3D object_resolve_child_property; object_ref(child); child->parent =3D obj; return op; } =20 +ObjectProperty * +object_property_add_child(Object *obj, const char *name, + Object *child) +{ + return object_property_try_add_child(obj, name, child, &error_abort); +} + void object_property_allow_set_link(const Object *obj, const char *name, Object *val, Error **errp) { diff --git a/qom/object_interfaces.c b/qom/object_interfaces.c index 7e26f86fa6..1e05e41d2f 100644 --- a/qom/object_interfaces.c +++ b/qom/object_interfaces.c @@ -82,8 +82,11 @@ Object *user_creatable_add_type(const char *type, const = char *id, } =20 if (id !=3D NULL) { - object_property_add_child(object_get_objects_root(), - id, obj); + object_property_try_add_child(object_get_objects_root(), + id, obj, &local_err); + if (local_err) { + goto out; + } } =20 user_creatable_complete(USER_CREATABLE(obj), &local_err); --=20 2.20.1 From nobody Wed Apr 24 21:03:23 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1593429961; cv=none; d=zohomail.com; s=zohoarc; b=TrMkNHAW+EmppRm7E1hxDqn4+I422QihW5k5pY+9zmsGI8f4b4XjCB5VzG+tGiWmbBWYhVplpdmmhaYk4taB578BUWIsF06bQaFaIcbDnZ6vCkHefVbRMsuPLibyMK9Bx15alaNZgZkauFuGgxSPSptHd/VdicS4o9P+MMbzJfM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1593429961; h=Content-Type:Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=UwQAVbpdFQI9b+XgK7I1zmB6hXm3BXJdj4GzBydNeng=; b=Fv1ixeXOzPkd8DAzOsxSr3bRRvNOzbzTimKcqQcWX6u3Us2JL/9fTw6vhNRSwlbBbV6Gi7zZzZyrHmR9FS39jwFaL67GHe5CyhgyZq3QkIqyNgU+A4U7SjNUt7F2MSIXv0mj1UqPfTCh78+3HMehZJ+ZJZaz+d7cvr5eO7MlZvg= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1593429961726849.3055552711093; Mon, 29 Jun 2020 04:26:01 -0700 (PDT) Received: from localhost ([::1]:43544 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jprvE-0005EH-Et for importer@patchew.org; Mon, 29 Jun 2020 07:26:00 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:48570) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jprt7-0001g9-KW for qemu-devel@nongnu.org; Mon, 29 Jun 2020 07:23:49 -0400 Received: from us-smtp-delivery-1.mimecast.com ([207.211.31.120]:23884 helo=us-smtp-1.mimecast.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1jprt6-0002J0-3l for qemu-devel@nongnu.org; Mon, 29 Jun 2020 07:23:49 -0400 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-225-AKDAIkf5PoW3N27tsy5mpQ-1; Mon, 29 Jun 2020 07:23:45 -0400 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 07FEC3640A; Mon, 29 Jun 2020 11:23:45 +0000 (UTC) Received: from laptop.redhat.com (ovpn-114-197.ams2.redhat.com [10.36.114.197]) by smtp.corp.redhat.com (Postfix) with ESMTP id 571325D9DA; Mon, 29 Jun 2020 11:23:43 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1593429827; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=UwQAVbpdFQI9b+XgK7I1zmB6hXm3BXJdj4GzBydNeng=; b=ZaBzCLiHmWt3wKAuHMKUjaS5jSdY83N1NVh/VotTHzbiSPkF9z93nWjtX1xuFsaFZ2r5Bd thWGzj3XpW2HZvsisK71maCKrFakZwx2PAe41a7UaH8/S1aapkOC9Spn5NUMYQi9Ym2fhf IBOPEvtZDzDRQVT6KqSEIY0RZHECRDQ= X-MC-Unique: AKDAIkf5PoW3N27tsy5mpQ-1 From: Eric Auger To: eric.auger.pro@gmail.com, eric.auger@redhat.com, qemu-devel@nongnu.org, pbonzini@redhat.com, berrange@redhat.com, ehabkost@redhat.com, armbru@redhat.com Subject: [PATCH v4 2/3] tests/qmp-cmd-test: Add qmp/object-add-duplicate-id Date: Mon, 29 Jun 2020 13:23:28 +0200 Message-Id: <20200629112329.27611-3-eric.auger@redhat.com> In-Reply-To: <20200629112329.27611-1-eric.auger@redhat.com> References: <20200629112329.27611-1-eric.auger@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=207.211.31.120; envelope-from=eric.auger@redhat.com; helo=us-smtp-1.mimecast.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/06/29 01:37:37 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -30 X-Spam_score: -3.1 X-Spam_bar: --- X-Spam_report: (-3.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-1, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=-0.01, RCVD_IN_MSPIKE_WL=-0.01, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=_AUTOLEARN X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" This new test checks that attempting to create an object with an existing ID gracefully fails. Signed-off-by: Eric Auger Acked-by: Thomas Huth Reviewed-by: Markus Armbruster --- tests/qtest/qmp-cmd-test.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/tests/qtest/qmp-cmd-test.c b/tests/qtest/qmp-cmd-test.c index 9f5228cd99..ceb3296691 100644 --- a/tests/qtest/qmp-cmd-test.c +++ b/tests/qtest/qmp-cmd-test.c @@ -213,6 +213,23 @@ static void test_object_add_without_props(void) qtest_quit(qts); } =20 +static void test_object_add_with_duplicate_id(void) +{ + QTestState *qts; + QDict *resp; + + qts =3D qtest_init(common_args); + resp =3D qtest_qmp(qts, "{'execute': 'object-add', 'arguments':" + " {'qom-type': 'memory-backend-ram', 'id': 'ram1', 'pr= ops': {'size': 4294967296 } } }"); + g_assert_nonnull(resp); + g_assert(qdict_haskey(resp, "return")); + resp =3D qtest_qmp(qts, "{'execute': 'object-add', 'arguments':" + " {'qom-type': 'memory-backend-ram', 'id': 'ram1', 'pr= ops': {'size': 4294967296 } } }"); + g_assert_nonnull(resp); + qmp_assert_error_class(resp, "GenericError"); + qtest_quit(qts); +} + int main(int argc, char *argv[]) { QmpSchema schema; @@ -225,6 +242,8 @@ int main(int argc, char *argv[]) =20 qtest_add_func("qmp/object-add-without-props", test_object_add_without_props); + qtest_add_func("qmp/object-add-duplicate-id", + test_object_add_with_duplicate_id); /* TODO: add coverage of generic object-add failure modes */ =20 ret =3D g_test_run(); --=20 2.20.1 From nobody Wed Apr 24 21:03:23 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1593429966; cv=none; d=zohomail.com; s=zohoarc; b=nD6Z8fl8BlTHmDwgLU7W8DOrwJxJS6u3S5MKW7xyPw+UmUFTJdOmHBK2DbYABhHGA1feiw5dtZx973Xy4djwtByEA45T7e7fSI34KVYcBROYD54zMqO7QwgV5e5o7EQAKvLP5IWDCvzijQ6sYRGOCFa9Z/aW48JUDAGucwWJ9GU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1593429966; h=Content-Type:Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=jw7UiwOGIyvWhHB5Jzrchrq2TVGk+MCmncwnq0g6Xrg=; b=fDx83ehWW1xnyiSdlGJCcHexAbax22/XqVQrYmavtrO5pkkXto+59vATyScVOSXKd9L6N8+wr2SNfBLSKkSSFz+2PXAUFXUX7JqRSq4+gIXw3C6oNlOscYdrORbVJRDuZw4b9xZjr9uJFcd2Xnuo7RRUj4DN8kqItPpcLE0Jrq8= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1593429966684887.9777971524161; Mon, 29 Jun 2020 04:26:06 -0700 (PDT) Received: from localhost ([::1]:43876 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jprvJ-0005MW-HA for importer@patchew.org; Mon, 29 Jun 2020 07:26:05 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:48588) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jprtB-0001qp-FR for qemu-devel@nongnu.org; Mon, 29 Jun 2020 07:23:53 -0400 Received: from us-smtp-2.mimecast.com ([205.139.110.61]:21391 helo=us-smtp-delivery-1.mimecast.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1jprt9-0002KA-Cr for qemu-devel@nongnu.org; Mon, 29 Jun 2020 07:23:53 -0400 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-488-eZkf1yYtMIyhPLOnit8diA-1; Mon, 29 Jun 2020 07:23:47 -0400 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 0FCB0804001; Mon, 29 Jun 2020 11:23:47 +0000 (UTC) Received: from laptop.redhat.com (ovpn-114-197.ams2.redhat.com [10.36.114.197]) by smtp.corp.redhat.com (Postfix) with ESMTP id 5D7835D9DA; Mon, 29 Jun 2020 11:23:45 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1593429830; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=jw7UiwOGIyvWhHB5Jzrchrq2TVGk+MCmncwnq0g6Xrg=; b=C98N1+cn5CEOM/yJ2UywpKAwChKpBz0nJ+WKapFlMfiKjU4Ut0Z3DnpnLPYAuLW9r6gpGX lkGevGMDvCpk5vF/da98UwrCBntjK2EfokjepD3VdwpgdFFcW6RCsClV5mfuTGyPo0N2SC G01xuUOdCV9T794sVGRBuRl1f5GRmts= X-MC-Unique: eZkf1yYtMIyhPLOnit8diA-1 From: Eric Auger To: eric.auger.pro@gmail.com, eric.auger@redhat.com, qemu-devel@nongnu.org, pbonzini@redhat.com, berrange@redhat.com, ehabkost@redhat.com, armbru@redhat.com Subject: [PATCH v4 3/3] tests/qmp-cmd-test: Add qmp/object-add-failure-modes Date: Mon, 29 Jun 2020 13:23:29 +0200 Message-Id: <20200629112329.27611-4-eric.auger@redhat.com> In-Reply-To: <20200629112329.27611-1-eric.auger@redhat.com> References: <20200629112329.27611-1-eric.auger@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=205.139.110.61; envelope-from=eric.auger@redhat.com; helo=us-smtp-delivery-1.mimecast.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/06/29 01:06:01 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -30 X-Spam_score: -3.1 X-Spam_bar: --- X-Spam_report: (-3.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-1, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=-0.01, RCVD_IN_MSPIKE_WL=-0.01, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=_AUTOLEARN X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" Merge the existing object-add test cases into a single test functions and cover more failure cases. Signed-off-by: Eric Auger --- tests/qtest/qmp-cmd-test.c | 98 +++++++++++++++++++++++++++++++++----- 1 file changed, 85 insertions(+), 13 deletions(-) diff --git a/tests/qtest/qmp-cmd-test.c b/tests/qtest/qmp-cmd-test.c index ceb3296691..4e755aaa95 100644 --- a/tests/qtest/qmp-cmd-test.c +++ b/tests/qtest/qmp-cmd-test.c @@ -200,25 +200,31 @@ static void add_query_tests(QmpSchema *schema) } } =20 -static void test_object_add_without_props(void) +static void test_object_add_failure_modes(void) { QTestState *qts; QDict *resp; =20 + /* attempt to create an object without props */ qts =3D qtest_init(common_args); resp =3D qtest_qmp(qts, "{'execute': 'object-add', 'arguments':" " {'qom-type': 'memory-backend-ram', 'id': 'ram1' } }"= ); g_assert_nonnull(resp); qmp_assert_error_class(resp, "GenericError"); - qtest_quit(qts); -} =20 -static void test_object_add_with_duplicate_id(void) -{ - QTestState *qts; - QDict *resp; + /* attempt to create an object without qom-type */ + resp =3D qtest_qmp(qts, "{'execute': 'object-add', 'arguments':" + " {'id': 'ram1' } }"); + g_assert_nonnull(resp); + qmp_assert_error_class(resp, "GenericError"); =20 - qts =3D qtest_init(common_args); + /* attempt to delete an object that does not exist */ + resp =3D qtest_qmp(qts, "{'execute': 'object-del', 'arguments':" + " {'id': 'ram1' } }"); + g_assert_nonnull(resp); + qmp_assert_error_class(resp, "GenericError"); + + /* attempt to create 2 objects with duplicate id */ resp =3D qtest_qmp(qts, "{'execute': 'object-add', 'arguments':" " {'qom-type': 'memory-backend-ram', 'id': 'ram1', 'pr= ops': {'size': 4294967296 } } }"); g_assert_nonnull(resp); @@ -227,6 +233,75 @@ static void test_object_add_with_duplicate_id(void) " {'qom-type': 'memory-backend-ram', 'id': 'ram1', 'pr= ops': {'size': 4294967296 } } }"); g_assert_nonnull(resp); qmp_assert_error_class(resp, "GenericError"); + + /* delete ram1 object */ + resp =3D qtest_qmp(qts, "{'execute': 'object-del', 'arguments':" + " {'id': 'ram1' } }"); + g_assert_nonnull(resp); + g_assert(qdict_haskey(resp, "return")); + + /* attempt to create an object with a property of a wrong type */ + resp =3D qtest_qmp(qts, "{'execute': 'object-add', 'arguments':" + " {'qom-type': 'memory-backend-ram', 'id': 'ram1', 'pr= ops': {'size': '4294967296' } } }"); + g_assert_nonnull(resp); + /* now do it right */ + qmp_assert_error_class(resp, "GenericError"); + resp =3D qtest_qmp(qts, "{'execute': 'object-add', 'arguments':" + " {'qom-type': 'memory-backend-ram', 'id': 'ram1', 'pr= ops': {'size': 4294967296 } } }"); + g_assert_nonnull(resp); + g_assert(qdict_haskey(resp, "return")); + + /* delete ram1 object */ + resp =3D qtest_qmp(qts, "{'execute': 'object-del', 'arguments':" + " {'id': 'ram1' } }"); + g_assert_nonnull(resp); + g_assert(qdict_haskey(resp, "return")); + + /* attempt to create an object without the id */ + resp =3D qtest_qmp(qts, "{'execute': 'object-add', 'arguments':" + " {'qom-type': 'memory-backend-ram', 'props': {'size':= '4294967296' } } }"); + g_assert_nonnull(resp); + qmp_assert_error_class(resp, "GenericError"); + /* now do it right */ + resp =3D qtest_qmp(qts, "{'execute': 'object-add', 'arguments':" + " {'qom-type': 'memory-backend-ram', 'id': 'ram1', 'pr= ops': {'size': 4294967296 } } }"); + g_assert_nonnull(resp); + g_assert(qdict_haskey(resp, "return")); + + /* delete ram1 object */ + resp =3D qtest_qmp(qts, "{'execute': 'object-del', 'arguments':" + " {'id': 'ram1' } }"); + g_assert_nonnull(resp); + g_assert(qdict_haskey(resp, "return")); + + /* attempt to set a non existing property */ + resp =3D qtest_qmp(qts, "{'execute': 'object-add', 'arguments':" + " {'qom-type': 'memory-backend-ram', 'id': 'ram1', 'pr= ops': {'sized': 4294967296 } } }"); + g_assert_nonnull(resp); + qmp_assert_error_class(resp, "GenericError"); + /* now do it right */ + resp =3D qtest_qmp(qts, "{'execute': 'object-add', 'arguments':" + " {'qom-type': 'memory-backend-ram', 'id': 'ram1', 'pr= ops': {'size': 4294967296 } } }"); + g_assert_nonnull(resp); + g_assert(qdict_haskey(resp, "return")); + + /* delete ram1 object without id */ + resp =3D qtest_qmp(qts, "{'execute': 'object-del', 'arguments':" + " {'ida': 'ram1' } }"); + g_assert_nonnull(resp); + + /* delete ram1 object */ + resp =3D qtest_qmp(qts, "{'execute': 'object-del', 'arguments':" + " {'id': 'ram1' } }"); + g_assert_nonnull(resp); + g_assert(qdict_haskey(resp, "return")); + + /* delete ram1 object that does not exist anymore*/ + resp =3D qtest_qmp(qts, "{'execute': 'object-del', 'arguments':" + " {'id': 'ram1' } }"); + g_assert_nonnull(resp); + qmp_assert_error_class(resp, "GenericError"); + qtest_quit(qts); } =20 @@ -240,11 +315,8 @@ int main(int argc, char *argv[]) qmp_schema_init(&schema); add_query_tests(&schema); =20 - qtest_add_func("qmp/object-add-without-props", - test_object_add_without_props); - qtest_add_func("qmp/object-add-duplicate-id", - test_object_add_with_duplicate_id); - /* TODO: add coverage of generic object-add failure modes */ + qtest_add_func("qmp/object-add-failure-modes", + test_object_add_failure_modes); =20 ret =3D g_test_run(); =20 --=20 2.20.1