[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v2 11/14] qlit: improve QLit dict vs qdict compa
From: |
Marc-André Lureau |
Subject: |
Re: [Qemu-devel] [PATCH v2 11/14] qlit: improve QLit dict vs qdict comparison |
Date: |
Wed, 30 Aug 2017 09:05:08 -0400 (EDT) |
Hi
----- Original Message -----
> Marc-André Lureau <address@hidden> writes:
>
> > Verify that all qdict values are covered.
> >
> > (a previous iteration of this patch created a copy of qdict to remove
> > all checked elements, verifying no duplicates exist in the literal
> > qdict, however this is a programming error, and a size comparison
> > should be enough)
>
> The parenthesis confused me, because I wasn't sure about the exact
> meaning of "a previous iteration of this patch". I tried to find a
> prior commit, but it looks like you're really talking about v1.
> Confused me, because I don't expect commit messages discussing previous
> iterations.
>
> What about:
>
> qlit: Tighten QLit dict vs qdict comparison
>
> We check that all members of the QLit dictionary are also in the
> QDict. We neglect to check the other direction.
>
> Comparing the number of members suffices, because QDict can't
> contain duplicate members, and putting duplicates in a QLit is a
> programming error.
Looks good to me
>
> > Signed-off-by: Marc-André Lureau <address@hidden>
> > ---
> > qobject/qlit.c | 37 +++++++++++++++++++++++--------------
> > tests/check-qlit.c | 7 +++++++
> > 2 files changed, 30 insertions(+), 14 deletions(-)
> >
> > diff --git a/qobject/qlit.c b/qobject/qlit.c
> > index b1d9146220..dc0015f76c 100644
> > --- a/qobject/qlit.c
> > +++ b/qobject/qlit.c
> > @@ -41,6 +41,27 @@ static void compare_helper(QObject *obj, void *opaque)
> > qlit_equal_qobject(&helper->objs[helper->index++], obj);
> > }
> >
> > +static bool qlit_equal_qdict(const QLitObject *lhs, const QDict *qdict)
> > +{
> > + int i;
> > +
> > + for (i = 0; lhs->value.qdict[i].key; i++) {
> > + QObject *obj = qdict_get(qdict, lhs->value.qdict[i].key);
> > +
> > + if (!qlit_equal_qobject(&lhs->value.qdict[i].value, obj)) {
> > + return false;
> > + }
> > + }
> > +
> > + /* Note: the literal qdict must not contain duplicates, this is
> > + * considered a programming error and it isn't checked here. */
> > + if (qdict_size(qdict) != i) {
> > + return false;
> > + }
> > +
> > + return true;
> > +}
> > +
> > bool qlit_equal_qobject(const QLitObject *lhs, const QObject *rhs)
> > {
> > if (!rhs || lhs->type != qobject_type(rhs)) {
> > @@ -55,20 +76,8 @@ bool qlit_equal_qobject(const QLitObject *lhs, const
> > QObject *rhs)
> > case QTYPE_QSTRING:
> > return (strcmp(lhs->value.qstr,
> > qstring_get_str(qobject_to_qstring(rhs))) == 0);
> > - case QTYPE_QDICT: {
> > - int i;
> > -
> > - for (i = 0; lhs->value.qdict[i].key; i++) {
> > - QObject *obj = qdict_get(qobject_to_qdict(rhs),
> > - lhs->value.qdict[i].key);
> > -
> > - if (!qlit_equal_qobject(&lhs->value.qdict[i].value, obj)) {
> > - return false;
> > - }
> > - }
> > -
> > - return true;
> > - }
> > + case QTYPE_QDICT:
> > + return qlit_equal_qdict(lhs, qobject_to_qdict(rhs));
> > case QTYPE_QLIST: {
> > QListCompareHelper helper;
> >
> > diff --git a/tests/check-qlit.c b/tests/check-qlit.c
> > index 47fde92a46..5d9558dfd9 100644
> > --- a/tests/check-qlit.c
> > +++ b/tests/check-qlit.c
> > @@ -28,6 +28,11 @@ static QLitObject qlit = QLIT_QDICT(((QLitDictEntry[]) {
> > { },
> > }));
> >
> > +static QLitObject qlit_foo = QLIT_QDICT(((QLitDictEntry[]) {
> > + { "foo", QLIT_QNUM(42) },
> > + { },
> > +}));
> > +
> > static QObject *make_qobject(void)
> > {
> > QDict *qdict = qdict_new();
> > @@ -51,6 +56,8 @@ static void qlit_equal_qobject_test(void)
> >
> > g_assert(qlit_equal_qobject(&qlit, qobj));
> >
> > + g_assert(!qlit_equal_qobject(&qlit_foo, qobj));
> > +
> > qobject_decref(qobj);
> > }
>
> Ah, you do have negative test cases, just not in the patch creating the
> test.
>
> When you leave gaps in that will be filled in later patches, I recomend
> pointing out the gaps in the commit message, with a promise they'll be
> filled shortly. Your reviewers will thank you.
>
> With am improved commit message,
> Reviewed-by: Markus Armbruster <address@hidden>
>
Thanks
- [Qemu-devel] [PATCH v2 05/14] qlit: rename compare_litqobj_to_qobj() to qlit_equal_qobject(), (continued)
- [Qemu-devel] [PATCH v2 05/14] qlit: rename compare_litqobj_to_qobj() to qlit_equal_qobject(), Marc-André Lureau, 2017/08/25
- [Qemu-devel] [PATCH v2 06/14] qlit: make qlit_equal_qobject return a bool, Marc-André Lureau, 2017/08/25
- [Qemu-devel] [PATCH v2 07/14] qlit: make qlit_equal_qobject() take const arguments, Marc-André Lureau, 2017/08/25
- [Qemu-devel] [PATCH v2 08/14] qlit: add QLIT_QNULL and QLIT_BOOL, Marc-André Lureau, 2017/08/25
- [Qemu-devel] [PATCH v2 09/14] qlit: Replace open-coded qnum_get_int() by call, Marc-André Lureau, 2017/08/25
- [Qemu-devel] [PATCH v2 10/14] tests: add qlit tests, Marc-André Lureau, 2017/08/25
- [Qemu-devel] [PATCH v2 11/14] qlit: improve QLit dict vs qdict comparison, Marc-André Lureau, 2017/08/25
- [Qemu-devel] [PATCH v2 13/14] qlit: add qobject_form_qlit(), Marc-André Lureau, 2017/08/25
- [Qemu-devel] [PATCH v2 12/14] qlit: improve QLit list vs qlist comparison, Marc-André Lureau, 2017/08/25
- [Qemu-devel] [PATCH v2 14/14] qapi: generate a literal qobject for introspection, Marc-André Lureau, 2017/08/25