From 8f36f8e63853a53971775d643c67b6e9e6128bc8 Mon Sep 17 00:00:00 2001 From: Juan RP Date: Wed, 6 Nov 2013 10:45:33 +0100 Subject: [PATCH] Make sure that configuration files are properly kept or unpacked. Added two new test cases to verify it works as advertised. --- lib/package_unpack.c | 6 +- tests/xbps/libxbps/Makefile | 1 + tests/xbps/libxbps/common/Kyuafile | 1 + tests/xbps/libxbps/conf_files/Makefile | 7 ++ .../libxbps/conf_files/conf_files_test.sh | 89 +++++++++++++++++++ 5 files changed, 102 insertions(+), 2 deletions(-) create mode 100644 tests/xbps/libxbps/conf_files/Makefile create mode 100644 tests/xbps/libxbps/conf_files/conf_files_test.sh diff --git a/lib/package_unpack.c b/lib/package_unpack.c index d3907072..8421037b 100644 --- a/lib/package_unpack.c +++ b/lib/package_unpack.c @@ -159,6 +159,7 @@ unpack_archive(struct xbps_handle *xhp, xbps_dictionary_t propsd, filesd, old_filesd; xbps_array_t array, obsoletes; xbps_object_t obj; + const struct stat *entry_statp; void *instbuf = NULL, *rembuf = NULL; struct stat st; struct xbps_unpack_cb_data xucd; @@ -232,6 +233,7 @@ unpack_archive(struct xbps_handle *xhp, entry_pname = archive_entry_pathname(entry); entry_size = archive_entry_size(entry); entry_type = archive_entry_filetype(entry); + entry_statp = archive_entry_stat(entry); /* * Ignore directories from archive. */ @@ -369,10 +371,10 @@ unpack_archive(struct xbps_handle *xhp, if (lstat(entry_pname, &st) == 0) file_exists = true; /* - * If file to be extracted does not match the file type of + * If file to be extracted does not match the mode_t of * file currently stored on disk, remove file on disk. */ - if (file_exists && (entry_type != (int)st.st_mode)) + if (file_exists && (entry_statp->st_mode != st.st_mode)) remove(entry_pname); if (!force && (entry_type == AE_IFREG)) { diff --git a/tests/xbps/libxbps/Makefile b/tests/xbps/libxbps/Makefile index dddd1675..14c17530 100644 --- a/tests/xbps/libxbps/Makefile +++ b/tests/xbps/libxbps/Makefile @@ -13,5 +13,6 @@ SUBDIRS += pkgdb SUBDIRS += issue6 SUBDIRS += issue18 SUBDIRS += issue20 +SUBDIRS += conf_files include ../../../mk/subdir.mk diff --git a/tests/xbps/libxbps/common/Kyuafile b/tests/xbps/libxbps/common/Kyuafile index bf440298..f600ae48 100644 --- a/tests/xbps/libxbps/common/Kyuafile +++ b/tests/xbps/libxbps/common/Kyuafile @@ -11,5 +11,6 @@ atf_test_program{name="find_pkg_obsoletes_test"} atf_test_program{name="issue6_test"} atf_test_program{name="issue18_test"} atf_test_program{name="issue20_test"} +atf_test_program{name="conf_files_test"} include('find_pkg_orphans/Kyuafile') include('pkgdb/Kyuafile') diff --git a/tests/xbps/libxbps/conf_files/Makefile b/tests/xbps/libxbps/conf_files/Makefile new file mode 100644 index 00000000..835a7611 --- /dev/null +++ b/tests/xbps/libxbps/conf_files/Makefile @@ -0,0 +1,7 @@ +TOPDIR = ../../../.. +-include $(TOPDIR)/config.mk + +TEST = conf_files_test + +include ../Makefile.inc +include $(TOPDIR)/mk/test-shell.mk diff --git a/tests/xbps/libxbps/conf_files/conf_files_test.sh b/tests/xbps/libxbps/conf_files/conf_files_test.sh new file mode 100644 index 00000000..b6e6ba5a --- /dev/null +++ b/tests/xbps/libxbps/conf_files/conf_files_test.sh @@ -0,0 +1,89 @@ +#! /usr/bin/env atf-sh + +# 1st test: modified configuration file on disk, unmodified on upgrade. +# result: keep file as is on disk. +atf_test_case tc1 + +tc1_head() { + atf_set "descr" "Tests for configuration file handling: on-disk modified, upgrade unmodified" +} + +tc1_body() { + mkdir repo + cd repo + mkdir pkg_a + echo "fooblah" > pkg_a/cf1.conf + xbps-create -A noarch -n a-0.1_1 -s "pkg a" --config-files "/cf1.conf" pkg_a + atf_check_equal $? 0 + rm -rf pkg_a + xbps-rindex -a *.xbps + atf_check_equal $? 0 + xbps-install -r rootdir --repository=$PWD -y a + atf_check_equal $? 0 + + sed -e 's,fooblah,blahfoo,' -i rootdir/cf1.conf + mkdir pkg_a + echo "fooblah" > pkg_a/cf1.conf + xbps-create -A noarch -n a-0.2_1 -s "pkg a" --config-files "/cf1.conf" pkg_a + atf_check_equal $? 0 + xbps-rindex -a *.xbps + rm -rf pkg_a + atf_check_equal $? 0 + xbps-install -r rootdir --repository=$PWD -yu + atf_check_equal $? 0 + result="$(cat rootdir/cf1.conf)" + rval=1 + if [ "${result}" = "blahfoo" ]; then + rval=0 + fi + atf_check_equal $rval 0 +} + +# 2nd test: modified configuration file on disk, modified on upgrade. +# result: install new file as ".new-". +atf_test_case tc2 + +tc2_head() { + atf_set "descr" "Tests for configuration file handling: on-disk modified, upgrade modified" +} + +tc2_body() { + mkdir repo + cd repo + mkdir pkg_a + echo "fooblah" > pkg_a/cf1.conf + xbps-create -A noarch -n a-0.1_1 -s "pkg a" --config-files "/cf1.conf" pkg_a + atf_check_equal $? 0 + rm -rf pkg_a + xbps-rindex -a *.xbps + atf_check_equal $? 0 + xbps-install -r rootdir --repository=$PWD -y a + atf_check_equal $? 0 + + sed -e 's,fooblah,blahfoo,' -i rootdir/cf1.conf + mkdir pkg_a + echo "bazbar" > pkg_a/cf1.conf + xbps-create -A noarch -n a-0.2_1 -s "pkg a" --config-files "/cf1.conf" pkg_a + atf_check_equal $? 0 + xbps-rindex -a *.xbps + rm -rf pkg_a + atf_check_equal $? 0 + xbps-install -r rootdir --repository=$PWD -yu + atf_check_equal $? 0 + result="$(cat rootdir/cf1.conf)" + rval=1 + if [ "${result}" = "blahfoo" ]; then + rval=0 + fi + atf_check_equal $rval 0 + rval=1 + if [ -s rootdir/cf1.conf.new-0.2_1 ]; then + rval=0 + fi + atf_check_equal $rval 0 +} + +atf_init_test_cases() { + atf_add_test_case tc1 + atf_add_test_case tc2 +}