From 749e03aa296260f9ce500e8cd015a1ec5e958348 Mon Sep 17 00:00:00 2001 From: Juan RP Date: Mon, 12 Mar 2012 17:51:50 +0100 Subject: [PATCH] Make xbps_find_virtualpkg_conf_in_xxx_by_xxx part of the API and add kyua tests. --- include/xbps_api.h | 38 ++- include/xbps_api_impl.h | 17 -- lib/plist_find.c | 8 +- mk/test.mk | 5 + tests/libxbps/Makefile | 1 + tests/libxbps/common/Kyuafile | 2 + .../plist_find_virtualpkg_conf/Kyuafile | 6 + .../plist_find_virtualpkg_conf/Makefile | 8 + .../libxbps/plist_find_virtualpkg_conf/main.c | 219 ++++++++++++++++++ .../plist_find_virtualpkg_conf/xbps.conf | 1 + 10 files changed, 283 insertions(+), 22 deletions(-) create mode 100644 tests/libxbps/plist_find_virtualpkg_conf/Kyuafile create mode 100644 tests/libxbps/plist_find_virtualpkg_conf/Makefile create mode 100644 tests/libxbps/plist_find_virtualpkg_conf/main.c create mode 100644 tests/libxbps/plist_find_virtualpkg_conf/xbps.conf diff --git a/include/xbps_api.h b/include/xbps_api.h index 4d92dd0b..ab871bd7 100644 --- a/include/xbps_api.h +++ b/include/xbps_api.h @@ -56,7 +56,7 @@ */ #define XBPS_PKGINDEX_VERSION "1.4" -#define XBPS_API_VERSION "20120312" +#define XBPS_API_VERSION "20120312-1" #define XBPS_VERSION "0.15" /** @@ -1088,6 +1088,42 @@ prop_dictionary_t xbps_find_virtualpkg_in_array_by_name(prop_array_t array, */ prop_dictionary_t xbps_find_virtualpkg_in_array_by_pattern(prop_array_t array, const char *pattern); + +/** + * Finds a package dictionary in a proplib array by matching a pkgname + * in \a name as set by the virtual package settings in xbps.conf. + * + * @param[in] array The proplib array to search on. + * @param[in] name The virtual package name to match. + * + * @return The package dictionary on match, otherwise NULL is returned. + */ +prop_dictionary_t xbps_find_virtualpkg_conf_in_array_by_name(prop_array_t array, + const char *name); + +/** + * Finds a package dictionary in a proplib array by matching a pkgpattern + * in \a pattern as set by the virtual package settings in xbps.conf. + * + * @param[in] array The proplib array to search on. + * @param[in] pattern The virtual package pattern to match, i.e + * `foo>=0' or `foo<1'. + * + * @return The package dictionary on match, otherwise NULL is returned. + */ +prop_dictionary_t + xbps_find_virtualpkg_conf_in_array_by_pattern(prop_array_t array, + const char *pattern); + +prop_dictionary_t + xbps_find_virtualpkg_conf_in_dict_by_name(prop_dictionary_t d, + const char *key, + const char *name); +prop_dictionary_t + xbps_find_virtualpkg_conf_in_dict_by_pattern(prop_dictionary_t d, + const char *key, + const char *pattern); + /** * Match a package name in the specified array of strings. * diff --git a/include/xbps_api_impl.h b/include/xbps_api_impl.h index 30bb53c0..6a630393 100644 --- a/include/xbps_api_impl.h +++ b/include/xbps_api_impl.h @@ -159,23 +159,6 @@ int HIDDEN xbps_file_chdir_exec(const char *, const char *, ...); */ int HIDDEN xbps_transaction_package_replace(prop_dictionary_t); -/** - * @private - * From lib/plist_find.c - */ -prop_dictionary_t HIDDEN - xbps_find_virtualpkg_conf_in_array_by_name(prop_array_t, const char *); -prop_dictionary_t HIDDEN - xbps_find_virtualpkg_conf_in_dict_by_name(prop_dictionary_t, - const char *, - const char *); -prop_dictionary_t HIDDEN - xbps_find_virtualpkg_conf_in_array_by_pattern(prop_array_t, - const char *); -prop_dictionary_t HIDDEN - xbps_find_virtualpkg_conf_in_dict_by_pattern(prop_dictionary_t, - const char *, - const char *); /** * @private * From lib/cb_util.c diff --git a/lib/plist_find.c b/lib/plist_find.c index e25ecff3..464aca36 100644 --- a/lib/plist_find.c +++ b/lib/plist_find.c @@ -211,13 +211,13 @@ find_virtualpkg_user_in_array(prop_array_t array, return find_pkg_in_array(array, vpkgname, false, false); } -prop_dictionary_t HIDDEN +prop_dictionary_t xbps_find_virtualpkg_conf_in_array_by_name(prop_array_t array, const char *name) { return find_virtualpkg_user_in_array(array, name, false); } -prop_dictionary_t HIDDEN +prop_dictionary_t xbps_find_virtualpkg_conf_in_array_by_pattern(prop_array_t array, const char *p) { return find_virtualpkg_user_in_array(array, p, true); @@ -312,7 +312,7 @@ xbps_find_virtualpkg_in_dict_by_pattern(prop_dictionary_t d, return find_pkg_in_dict(d, key, pattern, true, true); } -prop_dictionary_t HIDDEN +prop_dictionary_t xbps_find_virtualpkg_conf_in_dict_by_name(prop_dictionary_t d, const char *key, const char *name) @@ -320,7 +320,7 @@ xbps_find_virtualpkg_conf_in_dict_by_name(prop_dictionary_t d, return find_virtualpkg_user_in_dict(d, key, name, false); } -prop_dictionary_t HIDDEN +prop_dictionary_t xbps_find_virtualpkg_conf_in_dict_by_pattern(prop_dictionary_t d, const char *key, const char *pattern) diff --git a/mk/test.mk b/mk/test.mk index af234baa..20c02fd3 100644 --- a/mk/test.mk +++ b/mk/test.mk @@ -13,6 +13,11 @@ clean: install: all install -d $(DESTDIR)$(TESTSDIR)/$(TESTSSUBDIR) install -m755 $(TEST) $(DESTDIR)$(TESTSDIR)/$(TESTSSUBDIR) +ifdef EXTRA_FILES + for f in $(EXTRA_FILES); do \ + install -m644 $${f} $(DESTDIR)$(TESTSDIR)/$(TESTSSUBDIR); \ + done +endif .PHONY: uninstall uninstall: diff --git a/tests/libxbps/Makefile b/tests/libxbps/Makefile index cdd5bd27..90324fea 100644 --- a/tests/libxbps/Makefile +++ b/tests/libxbps/Makefile @@ -11,5 +11,6 @@ SUBDIRS += plist_match SUBDIRS += plist_match_virtual SUBDIRS += plist_remove SUBDIRS += util +SUBDIRS += plist_find_virtualpkg_conf include ../../mk/subdir.mk diff --git a/tests/libxbps/common/Kyuafile b/tests/libxbps/common/Kyuafile index a5fd030d..6db08eba 100644 --- a/tests/libxbps/common/Kyuafile +++ b/tests/libxbps/common/Kyuafile @@ -11,3 +11,5 @@ atf_test_program{name="plist_match_test"} atf_test_program{name="plist_match_virtual_test"} atf_test_program{name="plist_remove_test"} atf_test_program{name="plist_array_replace_test"} + +include("plist_find_virtualpkg_conf/Kyuafile") diff --git a/tests/libxbps/plist_find_virtualpkg_conf/Kyuafile b/tests/libxbps/plist_find_virtualpkg_conf/Kyuafile new file mode 100644 index 00000000..e35925cc --- /dev/null +++ b/tests/libxbps/plist_find_virtualpkg_conf/Kyuafile @@ -0,0 +1,6 @@ +syntax("kyuafile", 1) + +test_suite("libxbps") + +atf_test_program{name="plist_find_virtualpkg_conf_test"} + diff --git a/tests/libxbps/plist_find_virtualpkg_conf/Makefile b/tests/libxbps/plist_find_virtualpkg_conf/Makefile new file mode 100644 index 00000000..baaeb4db --- /dev/null +++ b/tests/libxbps/plist_find_virtualpkg_conf/Makefile @@ -0,0 +1,8 @@ +TOPDIR = ../../.. +-include $(TOPDIR)/config.mk + +TESTSSUBDIR = libxbps/plist_find_virtualpkg_conf +TEST = plist_find_virtualpkg_conf_test +EXTRA_FILES = Kyuafile xbps.conf + +include $(TOPDIR)/mk/test.mk diff --git a/tests/libxbps/plist_find_virtualpkg_conf/main.c b/tests/libxbps/plist_find_virtualpkg_conf/main.c new file mode 100644 index 00000000..973e2e1a --- /dev/null +++ b/tests/libxbps/plist_find_virtualpkg_conf/main.c @@ -0,0 +1,219 @@ +/*- + * Copyright (c) 2012 Juan Romero Pardines. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *- + */ +#include +#include +#include + +static const char dictxml[] = +"\n" +"\n" +"\n" +"\n" +" packages\n" +" \n" +" \n" +" pkgname\n" +" xbps-src-git\n" +" version\n" +" 20120311\n" +" pkgver\n" +" xbps-src-git-20120311\n" +" provides\n" +" \n" +" xbps-src-24\n" +" \n" +" \n" +" \n" +" pkgname\n" +" xbps-src\n" +" version\n" +" 24\n" +" pkgver\n" +" xbps-src-24\n" +" \n" +" \n" +"\n" +"\n"; + +ATF_TC(find_virtualpkg_conf_in_array_by_name_test); +ATF_TC_HEAD(find_virtualpkg_conf_in_array_by_name_test, tc) +{ + atf_tc_set_md_var(tc, "descr", "Test xbps_find_virtualpkg_conf_in_array_by_name"); +} +ATF_TC_BODY(find_virtualpkg_conf_in_array_by_name_test, tc) +{ + struct xbps_handle xh; + prop_array_t a; + prop_dictionary_t d, dr; + const char *pkgver, *tcsdir; + char *cffile; + + /* get test source dir */ + tcsdir = atf_tc_get_config_var(tc, "srcdir"); + cffile = xbps_xasprintf("%s/xbps.conf", tcsdir); + ATF_REQUIRE(cffile != NULL); + + /* initialize xbps */ + memset(&xh, 0, sizeof(xh)); + xh.rootdir = "/tmp"; + xh.conffile = cffile; + ATF_REQUIRE_EQ(xbps_init(&xh), 0); + + d = prop_dictionary_internalize(dictxml); + ATF_REQUIRE_EQ(prop_object_type(d), PROP_TYPE_DICTIONARY); + + a = prop_dictionary_get(d, "packages"); + ATF_REQUIRE_EQ(prop_object_type(a), PROP_TYPE_ARRAY); + + dr = xbps_find_virtualpkg_conf_in_array_by_name(a, "xbps-src"); + ATF_REQUIRE_EQ(prop_object_type(dr), PROP_TYPE_DICTIONARY); + prop_dictionary_get_cstring_nocopy(dr, "pkgver", &pkgver); + ATF_REQUIRE_STREQ(pkgver, "xbps-src-git-20120311"); + + xbps_end(); +} + +ATF_TC(find_virtualpkg_conf_in_array_by_pattern_test); +ATF_TC_HEAD(find_virtualpkg_conf_in_array_by_pattern_test, tc) +{ + atf_tc_set_md_var(tc, "descr", "Test xbps_find_virtualpkg_conf_in_array_by_pattern"); +} +ATF_TC_BODY(find_virtualpkg_conf_in_array_by_pattern_test, tc) +{ + struct xbps_handle xh; + prop_array_t a; + prop_dictionary_t d, dr; + const char *pkgver, *tcsdir; + char *cffile; + + /* get test source dir */ + tcsdir = atf_tc_get_config_var(tc, "srcdir"); + cffile = xbps_xasprintf("%s/xbps.conf", tcsdir); + ATF_REQUIRE(cffile != NULL); + + /* initialize xbps */ + memset(&xh, 0, sizeof(xh)); + xh.rootdir = "/tmp"; + xh.conffile = cffile; + ATF_REQUIRE_EQ(xbps_init(&xh), 0); + + d = prop_dictionary_internalize(dictxml); + ATF_REQUIRE_EQ(prop_object_type(d), PROP_TYPE_DICTIONARY); + + a = prop_dictionary_get(d, "packages"); + ATF_REQUIRE_EQ(prop_object_type(a), PROP_TYPE_ARRAY); + + dr = xbps_find_virtualpkg_conf_in_array_by_pattern(a, "xbps-src>=24"); + ATF_REQUIRE_EQ(prop_object_type(dr), PROP_TYPE_DICTIONARY); + prop_dictionary_get_cstring_nocopy(dr, "pkgver", &pkgver); + ATF_REQUIRE_STREQ(pkgver, "xbps-src-git-20120311"); + + dr = xbps_find_virtualpkg_conf_in_array_by_pattern(a, "xbps-src>=25"); + ATF_REQUIRE(dr == NULL); + + xbps_end(); +} + +ATF_TC(find_virtualpkg_conf_in_dict_by_name_test); +ATF_TC_HEAD(find_virtualpkg_conf_in_dict_by_name_test, tc) +{ + atf_tc_set_md_var(tc, "descr", "Test xbps_find_virtualpkg_conf_in_dict_by_name"); +} +ATF_TC_BODY(find_virtualpkg_conf_in_dict_by_name_test, tc) +{ + struct xbps_handle xh; + prop_dictionary_t d, dr; + const char *pkgver, *tcsdir; + char *cffile; + + /* get test source dir */ + tcsdir = atf_tc_get_config_var(tc, "srcdir"); + cffile = xbps_xasprintf("%s/xbps.conf", tcsdir); + ATF_REQUIRE(cffile != NULL); + + /* initialize xbps */ + memset(&xh, 0, sizeof(xh)); + xh.rootdir = "/tmp"; + xh.conffile = cffile; + ATF_REQUIRE_EQ(xbps_init(&xh), 0); + + d = prop_dictionary_internalize(dictxml); + ATF_REQUIRE_EQ(prop_object_type(d), PROP_TYPE_DICTIONARY); + + dr = xbps_find_virtualpkg_conf_in_dict_by_name(d, "packages", "xbps-src"); + ATF_REQUIRE_EQ(prop_object_type(dr), PROP_TYPE_DICTIONARY); + prop_dictionary_get_cstring_nocopy(dr, "pkgver", &pkgver); + ATF_REQUIRE_STREQ(pkgver, "xbps-src-git-20120311"); + + xbps_end(); +} + +ATF_TC(find_virtualpkg_conf_in_dict_by_pattern_test); +ATF_TC_HEAD(find_virtualpkg_conf_in_dict_by_pattern_test, tc) +{ + atf_tc_set_md_var(tc, "descr", "Test xbps_find_virtualpkg_conf_in_pattern_by_name"); +} +ATF_TC_BODY(find_virtualpkg_conf_in_dict_by_pattern_test, tc) +{ + struct xbps_handle xh; + prop_dictionary_t d, dr; + const char *pkgver, *tcsdir; + char *cffile; + + /* get test source dir */ + tcsdir = atf_tc_get_config_var(tc, "srcdir"); + cffile = xbps_xasprintf("%s/xbps.conf", tcsdir); + ATF_REQUIRE(cffile != NULL); + + /* initialize xbps */ + memset(&xh, 0, sizeof(xh)); + xh.rootdir = "/tmp"; + xh.conffile = cffile; + ATF_REQUIRE_EQ(xbps_init(&xh), 0); + + d = prop_dictionary_internalize(dictxml); + ATF_REQUIRE_EQ(prop_object_type(d), PROP_TYPE_DICTIONARY); + + dr = xbps_find_virtualpkg_conf_in_dict_by_pattern(d, "packages", "xbps-src>=24"); + ATF_REQUIRE_EQ(prop_object_type(dr), PROP_TYPE_DICTIONARY); + prop_dictionary_get_cstring_nocopy(dr, "pkgver", &pkgver); + ATF_REQUIRE_STREQ(pkgver, "xbps-src-git-20120311"); + + dr = xbps_find_virtualpkg_conf_in_dict_by_pattern(d, "packages", "xbps-src>=25"); + ATF_REQUIRE(dr == NULL); + + xbps_end(); +} + +ATF_TP_ADD_TCS(tp) +{ + ATF_TP_ADD_TC(tp, find_virtualpkg_conf_in_array_by_name_test); + ATF_TP_ADD_TC(tp, find_virtualpkg_conf_in_array_by_pattern_test); + ATF_TP_ADD_TC(tp, find_virtualpkg_conf_in_dict_by_name_test); + ATF_TP_ADD_TC(tp, find_virtualpkg_conf_in_dict_by_pattern_test); + + return atf_no_error(); +} diff --git a/tests/libxbps/plist_find_virtualpkg_conf/xbps.conf b/tests/libxbps/plist_find_virtualpkg_conf/xbps.conf new file mode 100644 index 00000000..d2a1af76 --- /dev/null +++ b/tests/libxbps/plist_find_virtualpkg_conf/xbps.conf @@ -0,0 +1 @@ +virtual-package xbps-src-git { targets = "xbps-src-24" }