summaryrefslogtreecommitdiffstats
path: root/t/dh_installnss
diff options
context:
space:
mode:
Diffstat (limited to 't/dh_installnss')
-rw-r--r--t/dh_installnss/debian/changelog5
-rw-r--r--t/dh_installnss/debian/compat1
-rw-r--r--t/dh_installnss/debian/control89
-rw-r--r--t/dh_installnss/debian/foo-after1.nss1
-rw-r--r--t/dh_installnss/debian/foo-after2.nss1
-rw-r--r--t/dh_installnss/debian/foo-before1.nss1
-rw-r--r--t/dh_installnss/debian/foo-before2.nss1
-rw-r--r--t/dh_installnss/debian/foo-empty1.nss0
-rw-r--r--t/dh_installnss/debian/foo-empty2.nss3
-rw-r--r--t/dh_installnss/debian/foo-example.nss3
-rw-r--r--t/dh_installnss/debian/foo-first1.nss2
-rw-r--r--t/dh_installnss/debian/foo-first2.nss1
-rw-r--r--t/dh_installnss/debian/foo-first3.nss2
-rw-r--r--t/dh_installnss/debian/foo-last1.nss1
-rw-r--r--t/dh_installnss/debian/foo-last2.nss1
-rw-r--r--t/dh_installnss/debian/foo-last3.nss2
-rw-r--r--t/dh_installnss/debian/foo-multidb1.nss4
-rw-r--r--t/dh_installnss/debian/foo-newdb1.nss1
-rw-r--r--t/dh_installnss/debian/foo-newdb2.nss3
-rw-r--r--t/dh_installnss/debian/foo-newdb3.nss3
-rw-r--r--t/dh_installnss/debian/foo-other.nss1
-rw-r--r--t/dh_installnss/debian/foo-remove-only1.nss2
-rw-r--r--t/dh_installnss/debian/foo-skip.nss2
-rw-r--r--t/dh_installnss/debian/foo-substring.nss2
-rwxr-xr-xt/dh_installnss/dh_installnss.t652
-rw-r--r--t/dh_installnss/nsswitch.conf.template17
26 files changed, 801 insertions, 0 deletions
diff --git a/t/dh_installnss/debian/changelog b/t/dh_installnss/debian/changelog
new file mode 100644
index 0000000..5850f0e
--- /dev/null
+++ b/t/dh_installnss/debian/changelog
@@ -0,0 +1,5 @@
+foo (1.0-1) unstable; urgency=low
+
+ * Initial release. (Closes: #XXXXXX)
+
+ -- Test <testing@nowhere> Mon, 11 Jul 2016 18:10:59 +0200
diff --git a/t/dh_installnss/debian/compat b/t/dh_installnss/debian/compat
new file mode 100644
index 0000000..60d3b2f
--- /dev/null
+++ b/t/dh_installnss/debian/compat
@@ -0,0 +1 @@
+15
diff --git a/t/dh_installnss/debian/control b/t/dh_installnss/debian/control
new file mode 100644
index 0000000..8e137f7
--- /dev/null
+++ b/t/dh_installnss/debian/control
@@ -0,0 +1,89 @@
+Source: foo
+Section: misc
+Priority: optional
+Maintainer: Test <testing@example.org>
+Standards-Version: 3.9.8
+
+Package: foo-before1
+Architecture: all
+Description: package foo-before1
+
+Package: foo-before2
+Architecture: all
+Description: package foo-before2
+
+Package: foo-after1
+Architecture: all
+Description: package foo-after1
+
+Package: foo-after2
+Architecture: all
+Description: package foo-after2
+
+Package: foo-empty1
+Architecture: all
+Description: package foo-empty1
+
+Package: foo-empty2
+Architecture: all
+Description: package foo-empty2
+
+Package: foo-first1
+Architecture: all
+Description: package foo-first1
+
+Package: foo-first2
+Architecture: all
+Description: package foo-first2
+
+Package: foo-first3
+Architecture: all
+Description: package foo-first3
+
+Package: foo-last1
+Architecture: all
+Description: package foo-last1
+
+Package: foo-last2
+Architecture: all
+Description: package foo-last2
+
+Package: foo-last3
+Architecture: all
+Description: package foo-last3
+
+Package: foo-multidb1
+Architecture: all
+Description: package foo-multidb1
+
+Package: foo-newdb1
+Architecture: all
+Description: package foo-newdb1
+
+Package: foo-newdb2
+Architecture: all
+Description: package foo-newdb2
+
+Package: foo-newdb3
+Architecture: all
+Description: package foo-newdb3
+
+Package: foo-remove-only1
+Architecture: all
+Description: package foo-remove-only1
+
+Package: foo-other
+Architecture: all
+Description: package foo-other
+
+Package: foo-example
+Architecture: all
+Description: package foo-example
+
+Package: foo-skip
+Architecture: all
+Description: package foo-skip
+
+Package: foo-substring
+Architecture: all
+Description: package foo-substring
diff --git a/t/dh_installnss/debian/foo-after1.nss b/t/dh_installnss/debian/foo-after1.nss
new file mode 100644
index 0000000..aa65c17
--- /dev/null
+++ b/t/dh_installnss/debian/foo-after1.nss
@@ -0,0 +1 @@
+hosts after=dns foo
diff --git a/t/dh_installnss/debian/foo-after2.nss b/t/dh_installnss/debian/foo-after2.nss
new file mode 100644
index 0000000..0c0d053
--- /dev/null
+++ b/t/dh_installnss/debian/foo-after2.nss
@@ -0,0 +1 @@
+hosts after=dns,files foo
diff --git a/t/dh_installnss/debian/foo-before1.nss b/t/dh_installnss/debian/foo-before1.nss
new file mode 100644
index 0000000..d0d65a9
--- /dev/null
+++ b/t/dh_installnss/debian/foo-before1.nss
@@ -0,0 +1 @@
+hosts before=dns foo
diff --git a/t/dh_installnss/debian/foo-before2.nss b/t/dh_installnss/debian/foo-before2.nss
new file mode 100644
index 0000000..cdfd74d
--- /dev/null
+++ b/t/dh_installnss/debian/foo-before2.nss
@@ -0,0 +1 @@
+hosts before=dns,resolve foo
diff --git a/t/dh_installnss/debian/foo-empty1.nss b/t/dh_installnss/debian/foo-empty1.nss
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/t/dh_installnss/debian/foo-empty1.nss
diff --git a/t/dh_installnss/debian/foo-empty2.nss b/t/dh_installnss/debian/foo-empty2.nss
new file mode 100644
index 0000000..40afa03
--- /dev/null
+++ b/t/dh_installnss/debian/foo-empty2.nss
@@ -0,0 +1,3 @@
+# only comments here
+
+# and empty lines
diff --git a/t/dh_installnss/debian/foo-example.nss b/t/dh_installnss/debian/foo-example.nss
new file mode 100644
index 0000000..7708ddd
--- /dev/null
+++ b/t/dh_installnss/debian/foo-example.nss
@@ -0,0 +1,3 @@
+hosts before=dns mdns4
+hosts before=mdns4 mdns4_minimal [NOTFOUND=return]
+hosts remove-only mdns # In case the user manually added it
diff --git a/t/dh_installnss/debian/foo-first1.nss b/t/dh_installnss/debian/foo-first1.nss
new file mode 100644
index 0000000..8e29dd7
--- /dev/null
+++ b/t/dh_installnss/debian/foo-first1.nss
@@ -0,0 +1,2 @@
+#DB POS MODULE (ACTION?) (CONDITION?)
+hosts first foo
diff --git a/t/dh_installnss/debian/foo-first2.nss b/t/dh_installnss/debian/foo-first2.nss
new file mode 100644
index 0000000..10a78de
--- /dev/null
+++ b/t/dh_installnss/debian/foo-first2.nss
@@ -0,0 +1 @@
+hosts first foo [NOTFOUND=return]
diff --git a/t/dh_installnss/debian/foo-first3.nss b/t/dh_installnss/debian/foo-first3.nss
new file mode 100644
index 0000000..9c80174
--- /dev/null
+++ b/t/dh_installnss/debian/foo-first3.nss
@@ -0,0 +1,2 @@
+hosts first foo2
+hosts first foo2 [NOTFOUND=return]
diff --git a/t/dh_installnss/debian/foo-last1.nss b/t/dh_installnss/debian/foo-last1.nss
new file mode 100644
index 0000000..defa945
--- /dev/null
+++ b/t/dh_installnss/debian/foo-last1.nss
@@ -0,0 +1 @@
+hosts last foo
diff --git a/t/dh_installnss/debian/foo-last2.nss b/t/dh_installnss/debian/foo-last2.nss
new file mode 100644
index 0000000..e6ad245
--- /dev/null
+++ b/t/dh_installnss/debian/foo-last2.nss
@@ -0,0 +1 @@
+hosts last foo [NOTFOUND=return]
diff --git a/t/dh_installnss/debian/foo-last3.nss b/t/dh_installnss/debian/foo-last3.nss
new file mode 100644
index 0000000..cb85368
--- /dev/null
+++ b/t/dh_installnss/debian/foo-last3.nss
@@ -0,0 +1,2 @@
+hosts last foo2
+hosts last foo2 [NOTFOUND=return]
diff --git a/t/dh_installnss/debian/foo-multidb1.nss b/t/dh_installnss/debian/foo-multidb1.nss
new file mode 100644
index 0000000..8dc899c
--- /dev/null
+++ b/t/dh_installnss/debian/foo-multidb1.nss
@@ -0,0 +1,4 @@
+shadow first foo
+shadow last foo2
+group first foo
+passwd last baz
diff --git a/t/dh_installnss/debian/foo-newdb1.nss b/t/dh_installnss/debian/foo-newdb1.nss
new file mode 100644
index 0000000..606d085
--- /dev/null
+++ b/t/dh_installnss/debian/foo-newdb1.nss
@@ -0,0 +1 @@
+mydb database-add
diff --git a/t/dh_installnss/debian/foo-newdb2.nss b/t/dh_installnss/debian/foo-newdb2.nss
new file mode 100644
index 0000000..2d38f54
--- /dev/null
+++ b/t/dh_installnss/debian/foo-newdb2.nss
@@ -0,0 +1,3 @@
+mydb database-add
+
+mydb first foo
diff --git a/t/dh_installnss/debian/foo-newdb3.nss b/t/dh_installnss/debian/foo-newdb3.nss
new file mode 100644
index 0000000..7bd7149
--- /dev/null
+++ b/t/dh_installnss/debian/foo-newdb3.nss
@@ -0,0 +1,3 @@
+mydb database-require
+
+mydb first bar
diff --git a/t/dh_installnss/debian/foo-other.nss b/t/dh_installnss/debian/foo-other.nss
new file mode 100644
index 0000000..6f3c135
--- /dev/null
+++ b/t/dh_installnss/debian/foo-other.nss
@@ -0,0 +1 @@
+hosts last foo
diff --git a/t/dh_installnss/debian/foo-remove-only1.nss b/t/dh_installnss/debian/foo-remove-only1.nss
new file mode 100644
index 0000000..816ad1e
--- /dev/null
+++ b/t/dh_installnss/debian/foo-remove-only1.nss
@@ -0,0 +1,2 @@
+hosts first foo
+hosts remove-only resolve
diff --git a/t/dh_installnss/debian/foo-skip.nss b/t/dh_installnss/debian/foo-skip.nss
new file mode 100644
index 0000000..0002201
--- /dev/null
+++ b/t/dh_installnss/debian/foo-skip.nss
@@ -0,0 +1,2 @@
+hosts first foo skip-if-present=other1,other2
+hosts first foo2 skip-if-present=other3
diff --git a/t/dh_installnss/debian/foo-substring.nss b/t/dh_installnss/debian/foo-substring.nss
new file mode 100644
index 0000000..5843e2b
--- /dev/null
+++ b/t/dh_installnss/debian/foo-substring.nss
@@ -0,0 +1,2 @@
+hosts before=dns foo
+hosts first foo_extra
diff --git a/t/dh_installnss/dh_installnss.t b/t/dh_installnss/dh_installnss.t
new file mode 100755
index 0000000..95cfecd
--- /dev/null
+++ b/t/dh_installnss/dh_installnss.t
@@ -0,0 +1,652 @@
+#!/usr/bin/perl
+use strict;
+use warnings;
+
+use Test::More;
+use Cwd qw(abs_path);
+use File::Basename qw(dirname);
+use File::Path qw(make_path);
+use lib dirname(dirname(abs_path(__FILE__)));
+use Test::DH;
+use Debian::Debhelper::Dh_Lib qw(!dirname);
+
+plan(tests => 1);
+
+my $test_dir = abs_path(dirname(__FILE__));
+my $dpkg_root = "debian/foo";
+
+our @TEST_DH_EXTRA_TEMPLATE_FILES = (qw(
+ debian/changelog
+ debian/control
+ debian/foo-after1.nss
+ debian/foo-after2.nss
+ debian/foo-before1.nss
+ debian/foo-before2.nss
+ debian/foo-empty1.nss
+ debian/foo-empty2.nss
+ debian/foo-example.nss
+ debian/foo-first1.nss
+ debian/foo-first2.nss
+ debian/foo-first3.nss
+ debian/foo-last1.nss
+ debian/foo-last2.nss
+ debian/foo-last3.nss
+ debian/foo-multidb1.nss
+ debian/foo-newdb1.nss
+ debian/foo-newdb2.nss
+ debian/foo-newdb3.nss
+ debian/foo-other.nss
+ debian/foo-remove-only1.nss
+ debian/foo-skip.nss
+ debian/foo-substring.nss
+));
+
+each_compat_subtest {
+ make_path(qw(debian/foo debian/foo/etc));
+ ok(run_dh_tool("dh_installnss"));
+
+ $ENV{"DPKG_ROOT"} = "$dpkg_root";
+ $ENV{"DPKG_MAINTSCRIPT_PACKAGE_INSTCOUNT"} = 0;
+
+ subtest "skips installation if no /etc/nsswitch.conf" => sub {
+ unlink("$dpkg_root/etc/nsswitch.conf");
+ exec_script_ok("foo-first1", "preinst", "install");
+ exec_script_ok("foo-first1", "postinst", "configure");
+ ok(!-e "$dpkg_root/etc/nsswitch.conf");
+ };
+
+ subtest "respects skip-if-present" => sub {
+ place_nsswitch_file("hosts", "files other2 dns");
+ exec_script_ok("foo-skip", "preinst", "install");
+ exec_script_ok("foo-skip", "postinst", "configure");
+ is(db_line("hosts"), "hosts: foo2 files other2 dns");
+ exec_script_ok("foo-skip", "postrm", "remove");
+ is(db_line("hosts"), "hosts: files other2 dns");
+ };
+
+ subtest "position=first" => sub {
+ subtest "adds in first position" => sub {
+ place_nsswitch_file("hosts", "files other2 dns");
+ exec_script_ok("foo-first1", "preinst", "install");
+ exec_script_ok("foo-first1", "postinst", "configure");
+ is(db_line("hosts"), "hosts: foo files other2 dns");
+ exec_script_ok("foo-first1", "postrm", "remove");
+ is(db_line("hosts"), "hosts: files other2 dns");
+ };
+
+ subtest "adds in first position (in presence of comments)" => sub {
+ place_nsswitch_file("hosts", "files other2 dns # comment");
+ exec_script_ok("foo-first1", "preinst", "install");
+ exec_script_ok("foo-first1", "postinst", "configure");
+ is(db_line("hosts"), "hosts: foo files other2 dns # comment");
+ exec_script_ok("foo-first1", "postrm", "remove");
+ is(db_line("hosts"), "hosts: files other2 dns # comment");
+ };
+
+ subtest "adds in first position (in presence of service in comment)" => sub {
+ place_nsswitch_file("hosts", "files other2 dns # foo in comment");
+ exec_script_ok("foo-first1", "preinst", "install");
+ exec_script_ok("foo-first1", "postinst", "configure");
+ is(db_line("hosts"), "hosts: foo files other2 dns # foo in comment");
+ exec_script_ok("foo-first1", "postrm", "remove");
+ is(db_line("hosts"), "hosts: files other2 dns # foo in comment");
+ };
+
+ subtest "adds in first position (with action)" => sub {
+ place_nsswitch_file("hosts", "files other2 dns");
+ exec_script_ok("foo-first2", "preinst", "install");
+ exec_script_ok("foo-first2", "postinst", "configure");
+ is(db_line("hosts"), "hosts: foo [NOTFOUND=return] files other2 dns");
+ exec_script_ok("foo-first2", "postrm", "remove");
+ is(db_line("hosts"), "hosts: files other2 dns");
+ };
+
+ subtest "adds in first position (multiple times)" => sub {
+ place_nsswitch_file("hosts", "files other2 dns");
+ exec_script_ok("foo-first3", "preinst", "install");
+ exec_script_ok("foo-first3", "postinst", "configure");
+ is(db_line("hosts"), "hosts: foo2 [NOTFOUND=return] foo2 files other2 dns");
+ exec_script_ok("foo-first3", "postrm", "remove");
+ is(db_line("hosts"), "hosts: files other2 dns");
+ };
+
+ subtest "does not add if already present in line (service name)" => sub {
+ place_nsswitch_file("hosts", "files foo dns");
+ exec_script_ok("foo-first1", "preinst", "install");
+ exec_script_ok("foo-first1", "postinst", "configure");
+ is(db_line("hosts"), "hosts: files foo dns");
+ exec_script_ok("foo-first1", "postrm", "remove");
+ is(db_line("hosts"), "hosts: files dns");
+ };
+
+ subtest "does not add if already present in line (service first)" => sub {
+ place_nsswitch_file("hosts", "foo files dns");
+ exec_script_ok("foo-first1", "preinst", "install");
+ exec_script_ok("foo-first1", "postinst", "configure");
+ is(db_line("hosts"), "hosts: foo files dns");
+ exec_script_ok("foo-first1", "postrm", "remove");
+ is(db_line("hosts"), "hosts: files dns");
+ };
+
+ subtest "does not add if already present in line (service last)" => sub {
+ place_nsswitch_file("hosts", "files dns foo");
+ exec_script_ok("foo-first1", "preinst", "install");
+ exec_script_ok("foo-first1", "postinst", "configure");
+ is(db_line("hosts"), "hosts: files dns foo");
+ exec_script_ok("foo-first1", "postrm", "remove");
+ is(db_line("hosts"), "hosts: files dns");
+ };
+
+ subtest "does not add if already present in line (service last before comment)" => sub {
+ place_nsswitch_file("hosts", "files dns foo# comment");
+ exec_script_ok("foo-first1", "preinst", "install");
+ exec_script_ok("foo-first1", "postinst", "configure");
+ is(db_line("hosts"), "hosts: files dns foo# comment");
+ exec_script_ok("foo-first1", "postrm", "remove");
+ is(db_line("hosts"), "hosts: files dns# comment");
+ };
+
+ subtest "does not add if already present in line (service name with action)" => sub {
+ place_nsswitch_file("hosts", "files foo [NOTFOUND=return] dns");
+ exec_script_ok("foo-first2", "preinst", "install");
+ exec_script_ok("foo-first2", "postinst", "configure");
+ is(db_line("hosts"), "hosts: files foo [NOTFOUND=return] dns");
+ exec_script_ok("foo-first2", "postrm", "remove");
+ is(db_line("hosts"), "hosts: files dns");
+ };
+
+ subtest "does not if already present in line (service name without action)" => sub {
+ place_nsswitch_file("hosts", "files foo dns");
+ exec_script_ok("foo-first2", "preinst", "install");
+ exec_script_ok("foo-first2", "postinst", "configure");
+ is(db_line("hosts"), "hosts: files foo dns");
+ exec_script_ok("foo-first2", "postrm", "remove");
+ is(db_line("hosts"), "hosts: files dns");
+ };
+ };
+
+ subtest "position=last" => sub {
+ subtest "adds in last position" => sub {
+ place_nsswitch_file("hosts", "files other2 dns");
+ exec_script_ok("foo-last1", "preinst", "install");
+ exec_script_ok("foo-last1", "postinst", "configure");
+ is(db_line("hosts"), "hosts: files other2 dns foo");
+ exec_script_ok("foo-last1", "postrm", "remove");
+ is(db_line("hosts"), "hosts: files other2 dns");
+ };
+
+ subtest "adds in last position (with action)" => sub {
+ place_nsswitch_file("hosts", "files other2 dns");
+ exec_script_ok("foo-last2", "preinst", "install");
+ exec_script_ok("foo-last2", "postinst", "configure");
+ is(db_line("hosts"), "hosts: files other2 dns foo [NOTFOUND=return]");
+ exec_script_ok("foo-last2", "postrm", "remove");
+ is(db_line("hosts"), "hosts: files other2 dns");
+ };
+
+ subtest "adds in last position (multiple times)" => sub {
+ place_nsswitch_file("hosts", "files other2 dns");
+ exec_script_ok("foo-last3", "preinst", "install");
+ exec_script_ok("foo-last3", "postinst", "configure");
+ is(db_line("hosts"), "hosts: files other2 dns foo2 foo2 [NOTFOUND=return]");
+ exec_script_ok("foo-last3", "postrm", "remove");
+ is(db_line("hosts"), "hosts: files other2 dns");
+ };
+
+ subtest "adds before a comment" => sub {
+ place_nsswitch_file("hosts", "files other2 dns #a long comment");
+ exec_script_ok("foo-last1", "preinst", "install");
+ exec_script_ok("foo-last1", "postinst", "configure");
+ is(db_line("hosts"), "hosts: files other2 dns foo #a long comment");
+ exec_script_ok("foo-last1", "postrm", "remove");
+ is(db_line("hosts"), "hosts: files other2 dns #a long comment");
+ };
+
+ subtest "adds before a comment (no space)" => sub {
+ place_nsswitch_file("hosts", "files other2 dns#short comment");
+ exec_script_ok("foo-last1", "preinst", "install");
+ exec_script_ok("foo-last1", "postinst", "configure");
+ # The script unconditionally adds a space before the comment.
+ is(db_line("hosts"), "hosts: files other2 dns foo #short comment");
+ exec_script_ok("foo-last1", "postrm", "remove");
+ is(db_line("hosts"), "hosts: files other2 dns #short comment");
+ };
+ };
+
+ subtest "position=before" => sub {
+ subtest "adds before another" => sub {
+ place_nsswitch_file("hosts", "files other2 dns");
+ exec_script_ok("foo-before1", "preinst", "install");
+ exec_script_ok("foo-before1", "postinst", "configure");
+ is(db_line("hosts"), "hosts: files other2 foo dns");
+ exec_script_ok("foo-before1", "postrm", "remove");
+ is(db_line("hosts"), "hosts: files other2 dns");
+ };
+
+ subtest "adds before another (in presence of comments)" => sub {
+ place_nsswitch_file("hosts", "files other2 dns # comment");
+ exec_script_ok("foo-before1", "preinst", "install");
+ exec_script_ok("foo-before1", "postinst", "configure");
+ is(db_line("hosts"), "hosts: files other2 foo dns # comment");
+ exec_script_ok("foo-before1", "postrm", "remove");
+ is(db_line("hosts"), "hosts: files other2 dns # comment");
+ };
+
+ subtest "adds before another with action" => sub {
+ place_nsswitch_file("hosts", "files other2 dns [NOTFOUND=return]");
+ exec_script_ok("foo-before1", "preinst", "install");
+ exec_script_ok("foo-before1", "postinst", "configure");
+ is(db_line("hosts"), "hosts: files other2 foo dns [NOTFOUND=return]");
+ exec_script_ok("foo-before1", "postrm", "remove");
+ is(db_line("hosts"), "hosts: files other2 dns [NOTFOUND=return]");
+ };
+
+ subtest "does not add before another if missing" => sub {
+ place_nsswitch_file("hosts", "files other2");
+ exec_script_ok("foo-before1", "preinst", "install");
+ exec_script_ok("foo-before1", "postinst", "configure");
+ is(db_line("hosts"), "hosts: files other2");
+ exec_script_ok("foo-before1", "postrm", "remove");
+ is(db_line("hosts"), "hosts: files other2");
+ };
+
+ subtest "does not add if another missing (but in comment)" => sub {
+ place_nsswitch_file("hosts", "files other2 # dns");
+ exec_script_ok("foo-before1", "preinst", "install");
+ exec_script_ok("foo-before1", "postinst", "configure");
+ is(db_line("hosts"), "hosts: files other2 # dns");
+ exec_script_ok("foo-before1", "postrm", "remove");
+ is(db_line("hosts"), "hosts: files other2 # dns");
+ };
+
+ subtest "adds before another (multiple possibilites, one found)" => sub {
+ place_nsswitch_file("hosts", "files resolve other2");
+ exec_script_ok("foo-before2", "preinst", "install");
+ exec_script_ok("foo-before2", "postinst", "configure");
+ is(db_line("hosts"), "hosts: files foo resolve other2");
+ exec_script_ok("foo-before2", "postrm", "remove");
+ is(db_line("hosts"), "hosts: files resolve other2");
+ };
+
+ subtest "adds before another (multiple possibilites, same order)" => sub {
+ place_nsswitch_file("hosts", "files dns resolve other2");
+ exec_script_ok("foo-before2", "preinst", "install");
+ exec_script_ok("foo-before2", "postinst", "configure");
+ is(db_line("hosts"), "hosts: files foo dns resolve other2");
+ exec_script_ok("foo-before2", "postrm", "remove");
+ is(db_line("hosts"), "hosts: files dns resolve other2");
+ };
+
+ subtest "adds before another (multiple possibilites, inverted order)" => sub {
+ place_nsswitch_file("hosts", "files resolve other2 dns");
+ exec_script_ok("foo-before2", "preinst", "install");
+ exec_script_ok("foo-before2", "postinst", "configure");
+ is(db_line("hosts"), "hosts: files foo resolve other2 dns");
+ exec_script_ok("foo-before2", "postrm", "remove");
+ is(db_line("hosts"), "hosts: files resolve other2 dns");
+ };
+
+ subtest "adds before another (multiple possibilites, with action)" => sub {
+ place_nsswitch_file("hosts", "files resolve [!NOTFOUND=return] other2");
+ exec_script_ok("foo-before2", "preinst", "install");
+ exec_script_ok("foo-before2", "postinst", "configure");
+ is(db_line("hosts"), "hosts: files foo resolve [!NOTFOUND=return] other2");
+ exec_script_ok("foo-before2", "postrm", "remove");
+ is(db_line("hosts"), "hosts: files resolve [!NOTFOUND=return] other2");
+ };
+ };
+
+ subtest "position=after" => sub {
+ subtest "adds after another" => sub {
+ place_nsswitch_file("hosts", "files other2 dns");
+ exec_script_ok("foo-after1", "preinst", "install");
+ exec_script_ok("foo-after1", "postinst", "configure");
+ is(db_line("hosts"), "hosts: files other2 dns foo");
+ exec_script_ok("foo-after1", "postrm", "remove");
+ is(db_line("hosts"), "hosts: files other2 dns");
+ };
+
+ subtest "adds after another (in presence of comments)" => sub {
+ place_nsswitch_file("hosts", "files other2 dns # a comment");
+ exec_script_ok("foo-after1", "preinst", "install");
+ exec_script_ok("foo-after1", "postinst", "configure");
+ is(db_line("hosts"), "hosts: files other2 dns foo # a comment");
+ exec_script_ok("foo-after1", "postrm", "remove");
+ is(db_line("hosts"), "hosts: files other2 dns # a comment");
+ };
+
+ subtest "adds after another with action" => sub {
+ place_nsswitch_file("hosts", "dns [NOTFOUND=return] other2 files");
+ exec_script_ok("foo-after1", "preinst", "install");
+ exec_script_ok("foo-after1", "postinst", "configure");
+ is(db_line("hosts"), "hosts: dns [NOTFOUND=return] foo other2 files");
+ exec_script_ok("foo-after1", "postrm", "remove");
+ is(db_line("hosts"), "hosts: dns [NOTFOUND=return] other2 files");
+ };
+
+ subtest "does not add after another if missing (but in comment)" => sub {
+ place_nsswitch_file("hosts", "files other2 # dns");
+ exec_script_ok("foo-after1", "preinst", "install");
+ exec_script_ok("foo-after1", "postinst", "configure");
+ is(db_line("hosts"), "hosts: files other2 # dns");
+ exec_script_ok("foo-after1", "postrm", "remove");
+ is(db_line("hosts"), "hosts: files other2 # dns");
+ };
+
+ subtest "does not add after another if missing" => sub {
+ place_nsswitch_file("hosts", "files other2");
+ exec_script_ok("foo-after1", "preinst", "install");
+ exec_script_ok("foo-after1", "postinst", "configure");
+ is(db_line("hosts"), "hosts: files other2");
+ exec_script_ok("foo-after1", "postrm", "remove");
+ is(db_line("hosts"), "hosts: files other2");
+ };
+
+ subtest "adds after another (multiple possibilites)" => sub {
+ place_nsswitch_file("hosts", "files resolve other2");
+ exec_script_ok("foo-after2", "preinst", "install");
+ exec_script_ok("foo-after2", "postinst", "configure");
+ is(db_line("hosts"), "hosts: files foo resolve other2");
+ exec_script_ok("foo-after2", "postrm", "remove");
+ is(db_line("hosts"), "hosts: files resolve other2");
+ };
+ };
+
+ subtest "position=remove-only" => sub {
+ subtest "does not add remove-only services" => sub {
+ place_nsswitch_file("hosts", "files dns");
+ exec_script_ok("foo-remove-only1", "preinst", "install");
+ exec_script_ok("foo-remove-only1", "postinst", "configure");
+ is(db_line("hosts"), "hosts: foo files dns");
+ exec_script_ok("foo-remove-only1", "postrm", "remove");
+ is(db_line("hosts"), "hosts: files dns");
+ };
+
+ subtest "removes both added and already present services" => sub {
+ place_nsswitch_file("hosts", "foo files resolve dns");
+ exec_script_ok("foo-remove-only1", "postrm", "remove");
+ is(db_line("hosts"), "hosts: files dns");
+ };
+ };
+
+ subtest "addition" => sub {
+ subtest "skips if any service is already mentioned in a target database (1)" => sub {
+ place_nsswitch_file("shadow", "files foo dns");
+ exec_script_ok("foo-multidb1", "preinst", "install");
+ exec_script_ok("foo-multidb1", "postinst", "configure");
+ is(db_line("shadow"), "shadow: files foo dns");
+ exec_script_ok("foo-multidb1", "postrm", "remove");
+ is(db_line("shadow"), "shadow: files dns");
+ };
+
+ subtest "skips if any service is already mentioned in a target database (2)" => sub {
+ place_nsswitch_file("passwd", "baz files");
+ exec_script_ok("foo-multidb1", "preinst", "install");
+ exec_script_ok("foo-multidb1", "postinst", "configure");
+ is(db_line("passwd"), "passwd: baz files");
+ exec_script_ok("foo-multidb1", "postrm", "remove");
+ is(db_line("passwd"), "passwd: files");
+ };
+
+ subtest "adds if the service is mentioned in an unrelated database" => sub {
+ place_nsswitch_file("passwd", "files foo");
+ is(db_line("shadow"), "shadow: files");
+ exec_script_ok("foo-multidb1", "preinst", "install");
+ exec_script_ok("foo-multidb1", "postinst", "configure");
+ is(db_line("shadow"), "shadow: foo files foo2");
+ is(db_line("passwd"), "passwd: files foo baz");
+ exec_script_ok("foo-multidb1", "postrm", "remove");
+ is(db_line("shadow"), "shadow: files");
+ is(db_line("passwd"), "passwd: files foo");
+ };
+ };
+
+ subtest "removal" => sub {
+ subtest "succeeds if service has already been removed" => sub {
+ place_nsswitch_file("hosts", "files dns");
+ exec_script_ok("foo-other", "postrm", "remove");
+ is(db_line("hosts"), "hosts: files dns");
+ };
+
+ subtest "removes all instances of service (consecutive 1)" => sub {
+ place_nsswitch_file("hosts", "files foo foo [NOTFOUND=return] foo dns");
+ exec_script_ok("foo-other", "postrm", "remove");
+ is(db_line("hosts"), "hosts: files dns");
+ };
+
+ subtest "removes all instances of service (consecutive 2)" => sub {
+ place_nsswitch_file("hosts", "files foo [NOTFOUND=return] foo foo dns");
+ exec_script_ok("foo-other", "postrm", "remove");
+ is(db_line("hosts"), "hosts: files dns");
+ };
+
+ subtest "removes all instances of service (split 1)" => sub {
+ place_nsswitch_file("hosts", "files foo [NOTFOUND=return] foo dns foo");
+ exec_script_ok("foo-other", "postrm", "remove");
+ is(db_line("hosts"), "hosts: files dns");
+ };
+
+ subtest "removes all instances of service (split 2)" => sub {
+ place_nsswitch_file("hosts", "foo [NOTFOUND=return] files foo [!UNAVAIL=return] foo dns");
+ exec_script_ok("foo-other", "postrm", "remove");
+ is(db_line("hosts"), "hosts: files dns");
+ };
+
+ subtest "removes all instances of service (also during purge)" => sub {
+ place_nsswitch_file("hosts", "files foo foo [NOTFOUND=return] foo dns");
+ exec_script_ok("foo-other", "postrm", "purge");
+ is(db_line("hosts"), "hosts: files dns");
+ };
+
+ subtest "removes services with substring names" => sub {
+ place_nsswitch_file("hosts", "foo_extra files foo dns");
+ exec_script_ok("foo-substring", "postrm", "remove");
+ is(db_line("hosts"), "hosts: files dns");
+ };
+
+ subtest "removes services with substring names (in presence of comments)" => sub {
+ place_nsswitch_file("hosts", "foo_extra files foo dns# comment: foo is ok");
+ exec_script_ok("foo-substring", "postrm", "remove");
+ is(db_line("hosts"), "hosts: files dns# comment: foo is ok");
+ };
+ };
+
+ subtest "position=database-add" => sub {
+ subtest "adds a database if not already present (without service)" => sub {
+ place_nsswitch_file();
+ is(num_occurrences("mydb", dbs()), 0);
+ exec_script_ok("foo-newdb1", "preinst", "install");
+ exec_script_ok("foo-newdb1", "postinst", "configure");
+ is(db_line("mydb"), "mydb: ");
+ is(num_occurrences("mydb", dbs()), 1);
+ exec_script_ok("foo-newdb1", "postrm", "remove");
+ is(num_occurrences("mydb", dbs()), 0);
+ };
+
+ subtest "does not add the database if already present (without service)" => sub {
+ place_nsswitch_file();
+ is(num_occurrences("mydb", dbs()), 0);
+ # first install
+ exec_script_ok("foo-newdb1", "preinst", "install");
+ exec_script_ok("foo-newdb1", "postinst", "configure");
+ is(db_line("mydb"), "mydb: ");
+ is(num_occurrences("mydb", dbs()), 1);
+ # second install
+ exec_script_ok("foo-newdb1", "preinst", "install");
+ exec_script_ok("foo-newdb1", "postinst", "configure");
+ is(db_line("mydb"), "mydb: ");
+ is(num_occurrences("mydb", dbs()), 1);
+ exec_script_ok("foo-newdb1", "postrm", "remove");
+ is(num_occurrences("mydb", dbs()), 0);
+ };
+
+ subtest "adds a database if not already present (with service)" => sub {
+ place_nsswitch_file();
+ is(num_occurrences("mydb", dbs()), 0);
+ exec_script_ok("foo-newdb2", "preinst", "install");
+ exec_script_ok("foo-newdb2", "postinst", "configure");
+ is(db_line("mydb"), "mydb: foo "); # TODO: fix trailing space in v2
+ is(num_occurrences("mydb", dbs()), 1);
+ exec_script_ok("foo-newdb2", "postrm", "remove");
+ is(num_occurrences("mydb", dbs()), 0);
+ };
+
+ subtest "does not add the database if already present (with service)" => sub {
+ place_nsswitch_file();
+ is(num_occurrences("mydb", dbs()), 0);
+ # first install
+ exec_script_ok("foo-newdb2", "preinst", "install");
+ exec_script_ok("foo-newdb2", "postinst", "configure");
+ is(db_line("mydb"), "mydb: foo "); # TODO: fix trailing space in v2
+ is(num_occurrences("mydb", dbs()), 1);
+ # second install
+ exec_script_ok("foo-newdb2", "preinst", "install");
+ exec_script_ok("foo-newdb2", "postinst", "configure");
+ is(db_line("mydb"), "mydb: foo "); # TODO: fix trailing space in v2
+ is(num_occurrences("mydb", dbs()), 1);
+ # removal
+ exec_script_ok("foo-newdb2", "postrm", "remove");
+ is(num_occurrences("mydb", dbs()), 0);
+ };
+ };
+
+ subtest "position=detabase-require" => sub {
+ subtest "adds a service to the the database if already present" => sub {
+ place_nsswitch_file("mydb", "other");
+ is(num_occurrences("mydb", dbs()), 1);
+ exec_script_ok("foo-newdb3", "preinst", "install");
+ exec_script_ok("foo-newdb3", "postinst", "configure");
+ is(db_line("mydb"), "mydb: bar other");
+ is(num_occurrences("mydb", dbs()), 1);
+ exec_script_ok("foo-newdb3", "postrm", "remove");
+ is(db_line("mydb"), "mydb: other");
+ is(num_occurrences("mydb", dbs()), 1);
+ };
+
+ subtest "does not add a service if the database is missing" => sub {
+ place_nsswitch_file();
+ is(num_occurrences("mydb", dbs()), 0);
+ exec_script_ok("foo-newdb3", "preinst", "install");
+ exec_script_ok("foo-newdb3", "postinst", "configure");
+ is(num_occurrences("mydb", dbs()), 0);
+ exec_script_ok("foo-newdb3", "postrm", "remove");
+ is(num_occurrences("mydb", dbs()), 0);
+ };
+
+ subtest "does not remove the database during package removal" => sub {
+ place_nsswitch_file("mydb", " ");
+ is(num_occurrences("mydb", dbs()), 1);
+ exec_script_ok("foo-newdb3", "preinst", "install");
+ exec_script_ok("foo-newdb3", "postinst", "configure");
+ is(db_line("mydb"), "mydb: bar ");
+ is(num_occurrences("mydb", dbs()), 1);
+ exec_script_ok("foo-newdb3", "postrm", "remove");
+ is(db_line("mydb"), "mydb: ");
+ is(num_occurrences("mydb", dbs()), 1);
+ };
+ };
+
+ subtest "validation" => sub {
+ subtest "does not add debhelper snippets if .nss is empty" => sub {
+ my ($postinst_path) = find_script("foo-empty1", "postinst");
+ my ($postrm_path) = find_script("foo-empty1", "postrm");
+ is($postinst_path, undef);
+ is($postrm_path, undef);
+ };
+
+ subtest "does not add debhelper snippets if .nss is empty (with comments)" => sub {
+ my ($postinst_path) = find_script("foo-empty2", "postinst");
+ my ($postrm_path) = find_script("foo-empty2", "postrm");
+ is($postinst_path, undef);
+ is($postrm_path, undef);
+ };
+ };
+
+ subtest "example in docs" => sub {
+ place_nsswitch_file("hosts", "files dns");
+ exec_script_ok("foo-example", "preinst", "install");
+ exec_script_ok("foo-example", "postinst", "configure");
+ is(db_line("hosts"), "hosts: files mdns4_minimal [NOTFOUND=return] mdns4 dns");
+ exec_script_ok("foo-example", "postrm", "remove");
+ is(db_line("hosts"), "hosts: files dns");
+ };
+
+ ok(run_dh_tool('dh_clean'));
+};
+
+sub place_nsswitch_file {
+ my ($db, $line) = @_;
+ my $template_file = "$test_dir/nsswitch.conf.template";
+ my $conf_file = "debian/foo/etc/nsswitch.conf";
+
+ my $fd;
+ open($fd, '<', $template_file) or error("open($template_file): $!");
+ read($fd, my $conf, -s $fd);
+ close($fd);
+
+ if ($db && $line) {
+ my $db_line_re = "^$db:.*\$";
+ my $newline = "$db: $line";
+ if ($conf =~ /$db_line_re/m) {
+ $conf =~ s/$db_line_re/$newline/m;
+ } else {
+ $conf .= "\n$newline\n";
+ }
+ }
+
+ open($fd, '>', $conf_file) or error("open($conf_file): $!");
+ print($fd $conf);
+ close($fd);
+}
+
+sub exec_script_ok {
+ is(exec_script(@_), 0);
+}
+
+sub exec_script {
+ my ($package, $script, @args) = @_;
+ my ($script_path) = find_script($package, $script);
+ (defined $script_path && $script_path ne "") or error("No maintscript of type $script found");
+ system("sh", "-e", $script_path, @args);
+ return $? >> 8;
+}
+
+sub db_line {
+ my ($db) = @_;
+
+ my @lines = nsswitch_file_lines();
+
+ my $db_line_re = "^$db:";
+ my ($line) = grep({ m/$db_line_re/ } @lines);
+ $line //= "";
+ # Normalize spaces to simplify comparison.
+ $line =~ s/\s+/ /g;
+
+ return $line;
+}
+
+sub dbs {
+ my @lines = nsswitch_file_lines();
+
+ my @dbs = ();
+ foreach my $line (@lines) {
+ my ($db) = $line =~ m/^([a-zA-Z]+):/g;
+ push @dbs, $db if $db;
+ }
+
+ return @dbs;
+}
+
+sub nsswitch_file_lines {
+ open(my $fd, '<', "$dpkg_root/etc/nsswitch.conf");
+ my @lines = @{readlines($fd)};
+ close($fd);
+
+ return @lines;
+}
+
+sub num_occurrences {
+ my ($item, @array) = @_;
+
+ return scalar grep({$_ eq $item} @array);
+}
diff --git a/t/dh_installnss/nsswitch.conf.template b/t/dh_installnss/nsswitch.conf.template
new file mode 100644
index 0000000..8ecf84c
--- /dev/null
+++ b/t/dh_installnss/nsswitch.conf.template
@@ -0,0 +1,17 @@
+# A sample /etc/nsswitch.conf file
+
+passwd: files systemd
+group: files systemd
+shadow: files
+gshadow: files
+
+#hosts: files mdns4_minimal [NOTFOUND=return] dns
+hosts: files mdns4 [NOTFOUND=return] dns mymachines
+networks: files
+
+protocols: db files
+services: db files
+ethers: db files
+rpc: db files
+
+netgroup: nis