summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--t/data/SPECS/file-conflicts/ga.spec22
-rw-r--r--t/data/SPECS/file-conflicts/gc.spec22
-rw-r--r--t/data/SPECS/file-conflicts/gc_.spec22
-rw-r--r--t/data/SPECS/file-conflicts/gd.spec22
-rw-r--r--t/superuser--file-conflicts.t55
5 files changed, 139 insertions, 4 deletions
diff --git a/t/data/SPECS/file-conflicts/ga.spec b/t/data/SPECS/file-conflicts/ga.spec
new file mode 100644
index 00000000..8418bb07
--- /dev/null
+++ b/t/data/SPECS/file-conflicts/ga.spec
@@ -0,0 +1,22 @@
+Summary: x
+Name: ga
+Version: 1
+Release: 1
+License: x
+Group: x
+Url: x
+BuildArch: noarch
+
+%description
+x
+
+%install
+rm -rf $RPM_BUILD_ROOT
+install -d $RPM_BUILD_ROOT/etc
+ln -s dir $RPM_BUILD_ROOT/etc/dir_symlink
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+%files
+/etc/*
diff --git a/t/data/SPECS/file-conflicts/gc.spec b/t/data/SPECS/file-conflicts/gc.spec
new file mode 100644
index 00000000..75bd6f20
--- /dev/null
+++ b/t/data/SPECS/file-conflicts/gc.spec
@@ -0,0 +1,22 @@
+Summary: x
+Name: gc
+Version: 1
+Release: 1
+License: x
+Group: x
+Url: x
+BuildArch: noarch
+
+%description
+x
+
+%install
+rm -rf $RPM_BUILD_ROOT
+install -d $RPM_BUILD_ROOT/etc/dir_symlink
+echo a > $RPM_BUILD_ROOT/etc/dir_symlink/a
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+%files
+/etc/dir_symlink/a
diff --git a/t/data/SPECS/file-conflicts/gc_.spec b/t/data/SPECS/file-conflicts/gc_.spec
new file mode 100644
index 00000000..69dcac82
--- /dev/null
+++ b/t/data/SPECS/file-conflicts/gc_.spec
@@ -0,0 +1,22 @@
+Summary: x
+Name: gc_
+Version: 1
+Release: 1
+License: x
+Group: x
+Url: x
+BuildArch: noarch
+
+%description
+x
+
+%install
+rm -rf $RPM_BUILD_ROOT
+install -d $RPM_BUILD_ROOT/etc/dir_symlink
+echo a > $RPM_BUILD_ROOT/etc/dir_symlink/a
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+%files
+/etc/dir_symlink/a
diff --git a/t/data/SPECS/file-conflicts/gd.spec b/t/data/SPECS/file-conflicts/gd.spec
new file mode 100644
index 00000000..d11fb1db
--- /dev/null
+++ b/t/data/SPECS/file-conflicts/gd.spec
@@ -0,0 +1,22 @@
+Summary: x
+Name: gd
+Version: 1
+Release: 1
+License: x
+Group: x
+Url: x
+BuildArch: noarch
+
+%description
+x
+
+%install
+rm -rf $RPM_BUILD_ROOT
+install -d $RPM_BUILD_ROOT/etc/dir_symlink
+echo d > $RPM_BUILD_ROOT/etc/dir_symlink/a
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+%files
+/etc/dir_symlink/a
diff --git a/t/superuser--file-conflicts.t b/t/superuser--file-conflicts.t
index 195f5006..f02d1dc6 100644
--- a/t/superuser--file-conflicts.t
+++ b/t/superuser--file-conflicts.t
@@ -4,6 +4,10 @@
# a and c contents the same file name, with same content => should work
# a and d contents the same directory name => should work
# a and e contents the same path for a directory vs a symlink => should fail
+#
+# a and gc/gc_/gd contains different file => should work
+# ga and a and gc/gc_ contains the same resulting file, through symlink in ga, with same content => should work
+# ga and a and gd contains the same resulting file, through symlink in ga, with different content => should fail
use strict;
use lib '.', 't';
@@ -55,6 +59,24 @@ sub test_rpm_different_transactions {
test_rpm_i_succeeds('a');
test_rpm_i_succeeds('d');
check_installed_and_remove('a', 'd');
+
+ # the following need to be done in different transactions otherwise rpm is lost
+ test_rpm_i_succeeds('a');
+ test_rpm_i_succeeds('gd');
+ check_installed_and_remove('a', 'gd');
+ rmdir 'root/etc/dir_symlink'; # remove unowned directory
+ check_no_etc_files();
+
+ test_rpm_i_succeeds('a', 'ga');
+ test_rpm_i_fail('gd');
+ check_installed_names('a', 'ga');
+
+ test_rpm_i_succeeds('gc');
+ test_rpm_i_succeeds('gc_');
+ check_installed_names('a', 'ga', 'gc', 'gc_');
+ urpme('gc gc_'); # if you remove gc and a/ga at the same time, hell can happen...
+ check_installed_and_remove('a', 'ga');
+ check_no_etc_files();
}
sub test_urpmi_same_transaction {
@@ -81,13 +103,32 @@ sub test_urpmi_different_transactions {
test_urpmi_fail('e');
check_installed_names('a');
- # disabled, fail when dropping RPMTAG_FILEDIGESTS
- #urpmi('c');
- #check_installed_and_remove('a', 'c');
+ # fail when dropping RPMTAG_FILEDIGESTS
+ urpmi('c');
+ check_installed_and_remove('a', 'c');
- #urpmi('a');
+ urpmi('a');
urpmi('d');
check_installed_and_remove('a', 'd');
+
+ # the following need to be done in different transactions otherwise rpm is lost
+ urpmi('a');
+ urpmi('gd');
+ check_installed_and_remove('a', 'gd');
+ rmdir 'root/etc/dir_symlink'; # remove unowned directory
+ check_no_etc_files();
+
+ urpmi('a ga');
+ test_urpmi_fail('gd');
+ check_installed_names('a', 'ga');
+
+ urpmi('gc');
+ urpmi('gc_');
+ check_installed_names('a', 'ga', 'gc', 'gc_');
+ urpme('gc gc_'); # if you remove gc and a/ga at the same time, hell can happen...
+ check_installed_and_remove('a', 'ga');
+ check_no_etc_files();
+
}
sub test_rpm_i_succeeds {
@@ -104,3 +145,9 @@ sub test_urpmi_fail {
my ($rpms) = @_;
system_should_fail(urpmi_cmd() . " $rpms");
}
+
+sub check_no_etc_files() {
+ if (my @l = grep { !m!/urpmi$! } glob("$::pwd/root/etc/*")) {
+ fail(join(' ', @l) . " files should not be there");
+ }
+}