/ tests / lib / kv.c
kv.c
  1  /*-
  2   * Copyright(c) 2025 Baptiste Daroussin <bapt@FreeBSD.org>
  3   *
  4   * SPDX-License-Identifier: BSD-2-Clause
  5   */
  6  
  7  #include <atf-c.h>
  8  #include <private/pkg.h>
  9  
 10  ATF_TC_WITHOUT_HEAD(kv_sort);
 11  ATF_TC_WITHOUT_HEAD(kv_insert_sorted);
 12  ATF_TC_WITHOUT_HEAD(kv_search);
 13  
 14  ATF_TC_BODY(kv_insert_sorted, tc)
 15  {
 16  	kvlist_t kvl = vec_init();
 17  
 18  	ATF_REQUIRE_EQ_MSG(kvl.d, NULL, "vec_init failed");
 19  	ATF_REQUIRE_EQ_MSG(kvl.cap, 0, "vec_init failed");
 20  	ATF_REQUIRE_EQ_MSG(kvl.len, 0, "vec_init failed");
 21  
 22  	struct pkg_kv *kv = pkg_kv_new("key", "value");
 23  	ATF_REQUIRE_EQ(pkg_kv_insert_sorted(&kvl, kv), NULL);
 24  	ATF_REQUIRE_EQ(kvl.len, 1);
 25  	ATF_REQUIRE(pkg_kv_insert_sorted(&kvl, kv) != NULL);
 26  	ATF_REQUIRE_EQ(kvl.len, 1);
 27  
 28  	kv = pkg_kv_new("akey", "value");
 29  	ATF_REQUIRE_EQ(pkg_kv_insert_sorted(&kvl, kv), NULL);
 30  	ATF_REQUIRE_EQ(kvl.len, 2);
 31  	ATF_REQUIRE_STREQ(kvl.d[0]->key, "akey");
 32  	ATF_REQUIRE_STREQ(kvl.d[1]->key, "key");
 33  }
 34  
 35  ATF_TC_BODY(kv_sort, tc)
 36  {
 37  	kvlist_t kvl = vec_init();
 38  
 39  	ATF_REQUIRE_EQ_MSG(kvl.d, NULL, "vec_init failed");
 40  	ATF_REQUIRE_EQ_MSG(kvl.cap, 0, "vec_init failed");
 41  	ATF_REQUIRE_EQ_MSG(kvl.len, 0, "vec_init failed");
 42  
 43  	struct pkg_kv *kv = pkg_kv_new("key", "value");
 44  	vec_push(&kvl, kv);
 45  	ATF_REQUIRE_MSG(kvl.d != NULL, "vec_push failed");
 46  	ATF_REQUIRE_EQ_MSG(kvl.cap, 1, "vec_push failed");
 47  	ATF_REQUIRE_EQ_MSG(kvl.len, 1, "vec_push failed");
 48  
 49  	pkg_kv_sort(&kvl);
 50  
 51  	kv = pkg_kv_new("akey", "value");
 52  	vec_push(&kvl, kv);
 53  	ATF_REQUIRE_EQ_MSG(kvl.cap, 2, "vec_push failed");
 54  	ATF_REQUIRE_EQ_MSG(kvl.len, 2, "vec_push failed");
 55  	ATF_REQUIRE_STREQ_MSG(kvl.d[0]->key, "key", "Invalid first key");
 56  	ATF_REQUIRE_STREQ_MSG(kvl.d[1]->key, "akey", "Invalid first key");
 57  
 58  	pkg_kv_sort(&kvl);
 59  	ATF_REQUIRE_STREQ_MSG(kvl.d[0]->key, "akey", "Invalid first key");
 60  	ATF_REQUIRE_STREQ_MSG(kvl.d[1]->key, "key", "Invalid first key");
 61  
 62  	vec_free_and_free(&kvl, pkg_kv_free);
 63  }
 64  
 65  ATF_TC_BODY(kv_search, tc)
 66  {
 67  	kvlist_t kvl = vec_init();
 68  
 69  	ATF_REQUIRE_EQ_MSG(kvl.d, NULL, "vec_init failed");
 70  	ATF_REQUIRE_EQ_MSG(kvl.cap, 0, "vec_init failed");
 71  	ATF_REQUIRE_EQ_MSG(kvl.len, 0, "vec_init failed");
 72  
 73  	struct pkg_kv *kv = pkg_kv_new("key", "value");
 74  	vec_push(&kvl, kv);
 75  	ATF_REQUIRE_MSG(kvl.d != NULL, "vec_push failed");
 76  	ATF_REQUIRE_EQ_MSG(kvl.cap, 1, "vec_push failed");
 77  	ATF_REQUIRE_EQ_MSG(kvl.len, 1, "vec_push failed");
 78  
 79  	kv = pkg_kv_search(&kvl, "bla");
 80  	ATF_REQUIRE(kv == NULL);
 81  
 82  	kv = pkg_kv_search(&kvl, "key");
 83  	ATF_REQUIRE(kv != NULL);
 84  	ATF_REQUIRE_STREQ_MSG(kv->key, "key", "Invalid search result");
 85  	ATF_REQUIRE_STREQ_MSG(kv->value, "value", "Invalid search result");
 86  
 87  	kv = pkg_kv_new("akey", "value");
 88  	vec_push(&kvl, kv);
 89  	ATF_REQUIRE_EQ_MSG(kvl.cap, 2, "vec_push failed");
 90  	ATF_REQUIRE_EQ_MSG(kvl.len, 2, "vec_push failed");
 91  	ATF_REQUIRE_STREQ_MSG(kvl.d[0]->key, "key", "Invalid first key");
 92  	ATF_REQUIRE_STREQ_MSG(kvl.d[1]->key, "akey", "Invalid first key");
 93  
 94  	pkg_kv_sort(&kvl);
 95  	ATF_REQUIRE_STREQ_MSG(kvl.d[0]->key, "akey", "Invalid first key");
 96  	ATF_REQUIRE_STREQ_MSG(kvl.d[1]->key, "key", "Invalid first key");
 97  
 98  	kv = pkg_kv_search(&kvl, "key");
 99  	ATF_REQUIRE(kv != NULL);
100  	ATF_REQUIRE_STREQ_MSG(kv->key, "key", "Invalid search result");
101  	ATF_REQUIRE_STREQ_MSG(kv->value, "value", "Invalid search result");
102  
103  	kv = pkg_kv_search(&kvl, "akey");
104  	ATF_REQUIRE(kv != NULL);
105  	ATF_REQUIRE_STREQ_MSG(kv->key, "akey", "Invalid search result");
106  	ATF_REQUIRE_STREQ_MSG(kv->value, "value", "Invalid search result");
107  
108  	kv = pkg_kv_search(&kvl, "bla");
109  	ATF_REQUIRE(kv == NULL);
110  
111  	vec_free_and_free(&kvl, pkg_kv_free);
112  }
113  
114  ATF_TP_ADD_TCS(tp)
115  {
116  	ATF_TP_ADD_TC(tp, kv_insert_sorted);
117  	ATF_TP_ADD_TC(tp, kv_sort);
118  	ATF_TP_ADD_TC(tp, kv_search);
119  
120  	return (atf_no_error());
121  }