TESTS_DEB := pkg-conffile-v1 pkg-conffile-v2 \
             pkg-conffile-owns-filename pkg-conffile-owns-symlink

include ../Test.mk

build-hook:
	ln -sf test-conffile-owned \
	       pkg-conffile-owns-symlink/test-dir/test-conffile-to-be-removed

clean-hook:
	$(RM) pkg-conffile-owns-symlink/test-dir/test-conffile-to-be-removed
	$(RM) pkg-conffile-removal-present.deb

test-case:
	# Conffile marked for removal but present, cannot be installed.
	$(DPKG_BUILD_DEB) --nocheck pkg-conffile-removal-present
	! $(DPKG_INSTALL) pkg-conffile-removal-present.deb
	$(call pkg_is_not_installed,pkg-conffile-removal-present)
	$(DPKG_PURGE) pkg-conffile-removal-present

	# Unmodified case, one invocation.
	$(DPKG_INSTALL) pkg-conffile-v1.deb
	test -f "$(DPKG_INSTDIR)/test-dir/test-conffile-to-be-removed"
	test ! -f "$(DPKG_INSTDIR)/test-dir/test-conffile-to-be-removed.dpkg-old"
	$(DPKG_INSTALL) pkg-conffile-v2.deb
	test ! -f "$(DPKG_INSTDIR)/test-dir/test-conffile-to-be-removed"
	test ! -f "$(DPKG_INSTDIR)/test-dir/test-conffile-to-be-removed.dpkg-old"

	# Reset.
	$(DPKG_PURGE) pkg-conffile
	test ! -f "$(DPKG_INSTDIR)/test-dir/test-conffile-to-be-removed"
	test ! -f "$(DPKG_INSTDIR)/test-dir/test-conffile-to-be-removed.dpkg-old"

	# Unmodified case; but force it to happen via two invocations.
	$(DPKG_INSTALL) pkg-conffile-v1.deb
	test -f "$(DPKG_INSTDIR)/test-dir/test-conffile-to-be-removed"
	test ! -f "$(DPKG_INSTDIR)/test-dir/test-conffile-to-be-removed.dpkg-old"
	$(DPKG_UNPACK) pkg-conffile-v2.deb
	# The old conffile is removed during unpack.
	test ! -f "$(DPKG_INSTDIR)/test-dir/test-conffile-to-be-removed"
	test ! -f "$(DPKG_INSTDIR)/test-dir/test-conffile-to-be-removed.dpkg-old"
	# After configure, the file is still removed.
	$(DPKG_CONFIGURE) pkg-conffile
	test ! -f "$(DPKG_INSTDIR)/test-dir/test-conffile-to-be-removed"
	test ! -f "$(DPKG_INSTDIR)/test-dir/test-conffile-to-be-removed.dpkg-old"

	# Reset.
	$(DPKG_PURGE) pkg-conffile
	test ! -f "$(DPKG_INSTDIR)/test-dir/test-conffile-to-be-removed"
	test ! -f "$(DPKG_INSTDIR)/test-dir/test-conffile-to-be-removed.dpkg-old"

	# Modified; should store .dpkg-old.
	$(DPKG_INSTALL) pkg-conffile-v1.deb
	test -f "$(DPKG_INSTDIR)/test-dir/test-conffile-to-be-removed"
	echo "modify this" >"$(DPKG_INSTDIR)/test-dir/test-conffile-to-be-removed"
	$(DPKG_INSTALL) pkg-conffile-v2.deb
	test ! -f "$(DPKG_INSTDIR)/test-dir/test-conffile-to-be-removed"
	test -f "$(DPKG_INSTDIR)/test-dir/test-conffile-to-be-removed.dpkg-old"

	# Reset.
	$(DPKG_PURGE) pkg-conffile
	test ! -f "$(DPKG_INSTDIR)/test-dir/test-conffile-to-be-removed"
	$(RM) "$(DPKG_INSTDIR)/test-dir/test-conffile-to-be-removed.dpkg-old"

	# Queue a remove on upgrade, and move ownership.
	$(DPKG_INSTALL) pkg-conffile-v1.deb
	test -f "$(DPKG_INSTDIR)/test-dir/test-conffile-to-be-removed"
	$(DPKG_INSTALL) pkg-conffile-v2.deb
	test ! -f "$(DPKG_INSTDIR)/test-dir/test-conffile-to-be-removed"
	$(DPKG_INSTALL) pkg-conffile-owns-filename.deb
	test -f "$(DPKG_INSTDIR)/test-dir/test-conffile-to-be-removed"
	# Upgrade the package again, should not remove unowned conffile.
	$(DPKG_INSTALL) pkg-conffile-v2.deb
	test -f "$(DPKG_INSTDIR)/test-dir/test-conffile-to-be-removed"
	test ! -f "$(DPKG_INSTDIR)/test-dir/test-conffile-to-be-removed.dpkg-old"

	# Reset.
	$(DPKG_PURGE) pkg-conffile
	$(DPKG_PURGE) pkg-conffile-owns
	test ! -f "$(DPKG_INSTDIR)/test-dir/test-conffile-to-be-removed"
	test ! -f "$(DPKG_INSTDIR)/test-dir/test-conffile-to-be-removed.dpkg-old"

	# Queue a remove on upgrade, and move ownership via symlink.
	$(DPKG_INSTALL) pkg-conffile-v1.deb
	test -f "$(DPKG_INSTDIR)/test-dir/test-conffile-to-be-removed"
	$(DPKG_INSTALL) pkg-conffile-v2.deb
	test ! -f "$(DPKG_INSTDIR)/test-dir/test-conffile-to-be-removed"
	test ! -f "$(DPKG_INSTDIR)/test-dir/test-conffile-to-be-removed.dpkg-old"
	$(DPKG_INSTALL) pkg-conffile-owns-symlink.deb
	test -f "$(DPKG_INSTDIR)/test-dir/test-conffile-owned"
	test -L "$(DPKG_INSTDIR)/test-dir/test-conffile-to-be-removed"
	# Upgrade the package again, should not remove unowned conffile.
	$(DPKG_INSTALL) pkg-conffile-v2.deb
	test -f "$(DPKG_INSTDIR)/test-dir/test-conffile-owned"
	test -L "$(DPKG_INSTDIR)/test-dir/test-conffile-to-be-removed"

test-clean:
	$(DPKG_PURGE) pkg-conffile-removal-present
	$(DPKG_PURGE) pkg-conffile-owns
	$(DPKG_PURGE) pkg-conffile
	$(BEROOT) $(RM) -rf "$(DPKG_INSTDIR)/test-dir"
