Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
kvlist: add unit test and fix code
Baptiste Daroussin committed 1 year ago
commit 129fbf3af9c3f28418437106b1675d7112587f92
parent 367b63e
3 files changed +111 -5
modified libpkg/pkg_attributes.c
@@ -155,8 +155,8 @@ pkg_kv_free(struct pkg_kv *c)

static int
kv_cmp(const void *a, const void *b) {
-
	struct pkg_kv *ka = (struct pkg_kv *)a;
-
	struct pkg_kv *kb = (struct pkg_kv *)b;
+
	struct pkg_kv *ka = *(struct pkg_kv **)a;
+
	struct pkg_kv *kb = *(struct pkg_kv **)b;

	return (strcmp(ka->key, kb->key));
}
@@ -165,12 +165,13 @@ struct pkg_kv *
pkg_kv_search(kvlist_t *kv, char *el)
{
	struct pkg_kv target =  { .key = el, .value = NULL };
+
	struct pkg_kv *tgt = ⌖
	if (kv->len == 0)
		return (NULL);
-
	struct pkg_kv *res = bsearch(&target, *kv->d, kv->len, sizeof(struct pkg_kv), kv_cmp);
+
	struct pkg_kv **res = bsearch(&tgt, kv->d, kv->len, sizeof(kv->d[0]), kv_cmp);
	if (res == NULL)
		return (NULL);
-
	return (res);
+
	return (*res);
}

void
modified tests/Makefile.autosetup
@@ -16,7 +16,8 @@ TESTS= \
	vec \
	pkg_elf \
	hash \
-
	shlibs
+
	shlibs \
+
	kv

TESTS_SH= \
	frontend/pkg.sh \
@@ -116,6 +117,7 @@ vec_OBJS= lib/vec.o
pkg_elf_OBJS=	lib/pkg_elf.o
hash_OBJS=	lib/hash.o
shlibs_OBJS=	lib/shlibs.o
+
kv_OBJS=	lib/kv.o

SRCS=	\
	$(packing_OBJS:.o=.c) \
@@ -134,6 +136,7 @@ SRCS= \
	$(pkg_elf_OBJS:.o=.c) \
	$(hash_OBJS:.o=.c) \
	$(shlibs_OBJS:.o=.c) \
+
	$(kv_OBJS:.o=.c) \

include $(MK)/common.mk

added tests/lib/kv.c
@@ -0,0 +1,102 @@
+
/*-
+
 * Copyright(c) 2025 Baptiste Daroussin <bapt@FreeBSD.org>
+
 *
+
 * SPDX-License-Identifier: BSD-2-Clause
+
 */
+

+
#include <atf-c.h>
+
#include <private/pkg.h>
+

+
ATF_TC_WITHOUT_HEAD(kv_sort);
+
ATF_TC_WITHOUT_HEAD(kv_search);
+

+
ATF_TC_BODY(kv_sort, tc)
+
{
+
	kvlist_t kvl;
+

+
	vec_init(&kvl);
+

+
	ATF_REQUIRE_EQ_MSG(kvl.d, NULL, "vec_init failed");
+
	ATF_REQUIRE_EQ_MSG(kvl.cap, 0, "vec_init failed");
+
	ATF_REQUIRE_EQ_MSG(kvl.len, 0, "vec_init failed");
+

+
	struct pkg_kv *kv = pkg_kv_new("key", "value");
+
	vec_push(&kvl, kv);
+
	ATF_REQUIRE_MSG(kvl.d != NULL, "vec_push failed");
+
	ATF_REQUIRE_EQ_MSG(kvl.cap, 1, "vec_push failed");
+
	ATF_REQUIRE_EQ_MSG(kvl.len, 1, "vec_push failed");
+

+
	pkg_kv_sort(&kvl);
+

+
	kv = pkg_kv_new("akey", "value");
+
	vec_push(&kvl, kv);
+
	ATF_REQUIRE_EQ_MSG(kvl.cap, 2, "vec_push failed");
+
	ATF_REQUIRE_EQ_MSG(kvl.len, 2, "vec_push failed");
+
	ATF_REQUIRE_STREQ_MSG(kvl.d[0]->key, "key", "Invalid first key");
+
	ATF_REQUIRE_STREQ_MSG(kvl.d[1]->key, "akey", "Invalid first key");
+

+
	pkg_kv_sort(&kvl);
+
	ATF_REQUIRE_STREQ_MSG(kvl.d[0]->key, "akey", "Invalid first key");
+
	ATF_REQUIRE_STREQ_MSG(kvl.d[1]->key, "key", "Invalid first key");
+

+
	vec_free_and_free(&kvl, pkg_kv_free);
+
}
+

+
ATF_TC_BODY(kv_search, tc)
+
{
+
	kvlist_t kvl;
+

+
	vec_init(&kvl);
+

+
	ATF_REQUIRE_EQ_MSG(kvl.d, NULL, "vec_init failed");
+
	ATF_REQUIRE_EQ_MSG(kvl.cap, 0, "vec_init failed");
+
	ATF_REQUIRE_EQ_MSG(kvl.len, 0, "vec_init failed");
+

+
	struct pkg_kv *kv = pkg_kv_new("key", "value");
+
	vec_push(&kvl, kv);
+
	ATF_REQUIRE_MSG(kvl.d != NULL, "vec_push failed");
+
	ATF_REQUIRE_EQ_MSG(kvl.cap, 1, "vec_push failed");
+
	ATF_REQUIRE_EQ_MSG(kvl.len, 1, "vec_push failed");
+

+
	kv = pkg_kv_search(&kvl, "bla");
+
	ATF_REQUIRE(kv == NULL);
+

+
	kv = pkg_kv_search(&kvl, "key");
+
	ATF_REQUIRE(kv != NULL);
+
	ATF_REQUIRE_STREQ_MSG(kv->key, "key", "Invalid search result");
+
	ATF_REQUIRE_STREQ_MSG(kv->value, "value", "Invalid search result");
+

+
	kv = pkg_kv_new("akey", "value");
+
	vec_push(&kvl, kv);
+
	ATF_REQUIRE_EQ_MSG(kvl.cap, 2, "vec_push failed");
+
	ATF_REQUIRE_EQ_MSG(kvl.len, 2, "vec_push failed");
+
	ATF_REQUIRE_STREQ_MSG(kvl.d[0]->key, "key", "Invalid first key");
+
	ATF_REQUIRE_STREQ_MSG(kvl.d[1]->key, "akey", "Invalid first key");
+

+
	pkg_kv_sort(&kvl);
+
	ATF_REQUIRE_STREQ_MSG(kvl.d[0]->key, "akey", "Invalid first key");
+
	ATF_REQUIRE_STREQ_MSG(kvl.d[1]->key, "key", "Invalid first key");
+

+
	kv = pkg_kv_search(&kvl, "key");
+
	ATF_REQUIRE(kv != NULL);
+
	ATF_REQUIRE_STREQ_MSG(kv->key, "key", "Invalid search result");
+
	ATF_REQUIRE_STREQ_MSG(kv->value, "value", "Invalid search result");
+

+
	kv = pkg_kv_search(&kvl, "akey");
+
	ATF_REQUIRE(kv != NULL);
+
	ATF_REQUIRE_STREQ_MSG(kv->key, "akey", "Invalid search result");
+
	ATF_REQUIRE_STREQ_MSG(kv->value, "value", "Invalid search result");
+

+
	kv = pkg_kv_search(&kvl, "bla");
+
	ATF_REQUIRE(kv == NULL);
+

+
	vec_free_and_free(&kvl, pkg_kv_free);
+
}
+

+
ATF_TP_ADD_TCS(tp)
+
{
+
	ATF_TP_ADD_TC(tp, kv_sort);
+
	ATF_TP_ADD_TC(tp, kv_search);
+

+
	return (atf_no_error());
+
}