summaryrefslogtreecommitdiffstats
path: root/scripts/t/dpkg_source.t
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/t/dpkg_source.t')
-rw-r--r--scripts/t/dpkg_source.t186
1 files changed, 186 insertions, 0 deletions
diff --git a/scripts/t/dpkg_source.t b/scripts/t/dpkg_source.t
new file mode 100644
index 0000000..68b9729
--- /dev/null
+++ b/scripts/t/dpkg_source.t
@@ -0,0 +1,186 @@
+#!/usr/bin/perl
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+use strict;
+use warnings;
+
+use Test::More;
+use Test::Dpkg qw(:needs :paths test_neutralize_checksums);
+
+use File::Spec::Functions qw(rel2abs);
+use File::Compare;
+use File::Path qw(make_path);
+
+use Dpkg::File;
+use Dpkg::IPC;
+use Dpkg::Substvars;
+
+test_needs_command('xz');
+
+plan tests => 8;
+
+my $srcdir = rel2abs($ENV{srcdir} || '.');
+my $datadir = "$srcdir/t/dpkg_source";
+my $tmpdir = test_get_temp_path();
+
+$ENV{$_} = rel2abs($ENV{$_}) foreach qw(DPKG_DATADIR DPKG_ORIGINS_DIR);
+
+# Delete variables that can affect the tests.
+delete $ENV{SOURCE_DATE_EPOCH};
+
+chdir $tmpdir;
+
+my $tmpl_format = <<'TMPL_FORMAT';
+3.0 (native)
+TMPL_FORMAT
+
+my $tmpl_changelog = <<'TMPL_CHANGELOG';
+${source-name} (${source-version}) ${suite}; urgency=${urgency}
+
+ * Test package.
+
+ -- ${maintainer} Sat, 05 Jul 2014 21:11:22 +0200
+TMPL_CHANGELOG
+
+my $tmpl_control = <<'TMPL_CONTROL';
+Source: ${source-name}
+Section: ${source-section}
+Priority: ${source-priority}
+Maintainer: ${maintainer}
+Standards-Version: 1.0
+Testsuite: ${source-testsuite}
+
+Package: test-binary
+Architecture: all
+Description: test package
+TMPL_CONTROL
+
+my $tmpl_control_tests = <<'TMPL_CONTROL_TESTS';
+Test-Command: test-unique
+Depends: @, aa
+
+Tests: test-dupe
+Depends: @builddeps@
+
+Test-Command: test-dupe
+Depends: bb, test-binary
+
+Test-Command: test-dupe
+Depends: cc
+TMPL_CONTROL_TESTS
+
+my %default_substvars = (
+ 'source-name' => 'test-source',
+ 'source-version' => 0,
+ 'source-section' => 'test',
+ 'source-priority' => 'optional',
+ 'source-testsuite' => 'autopkgtest',
+ 'suite' => 'unstable',
+ 'urgency' => 'low',
+ 'maintainer' => 'Dpkg Developers <debian-dpkg@lists.debian.org>',
+);
+
+sub gen_from_tmpl
+{
+ my ($pathname, $tmpl, $substvars) = @_;
+
+ file_dump($pathname, $substvars->substvars($tmpl));
+}
+
+sub gen_source
+{
+ my (%options) = @_;
+
+ my $substvars = Dpkg::Substvars->new();
+ foreach my $var ((keys %default_substvars, keys %options)) {
+ my $value = $options{$var} // $default_substvars{$var};
+
+ $substvars->set_as_auto($var, $value);
+ }
+
+ my $source = $substvars->get('source-name');
+ my $version = $substvars->get('source-version');
+ my $dirname = "$source-$version";
+
+ make_path("$dirname/debian/source");
+
+ gen_from_tmpl("$dirname/debian/source/format", $tmpl_format, $substvars);
+ gen_from_tmpl("$dirname/debian/changelog", $tmpl_changelog, $substvars);
+ gen_from_tmpl("$dirname/debian/control", $tmpl_control, $substvars);
+
+ if (defined $options{'control-test'}) {
+ make_path("$dirname/debian/tests");
+ gen_from_tmpl("$dirname/debian/tests/control", $options{'control-test'}, $substvars);
+ }
+
+ return $dirname;
+}
+
+sub test_diff
+{
+ my $filename = shift;
+
+ my $expected_file = "$datadir/$filename";
+ my $generated_file = $filename;
+
+ test_neutralize_checksums($generated_file);
+
+ my $res = compare($expected_file, $generated_file);
+ if ($res) {
+ system "diff -u $expected_file $generated_file >&2";
+ }
+ ok($res == 0, "generated file matches expected one ($expected_file)");
+}
+
+sub test_build_source
+{
+ my ($name) = shift;
+ my $stderr;
+
+ spawn(exec => [ $ENV{PERL}, "$srcdir/dpkg-source.pl", '--build', $name ],
+ error_to_string => \$stderr,
+ wait_child => 1, nocheck => 1);
+
+ ok($? == 0, 'dpkg-source --build succeeded');
+ diag($stderr) unless $? == 0;
+
+ my $basename = $name =~ tr/-/_/r;
+
+ test_diff("$basename.dsc");
+}
+
+my $dirname;
+
+$dirname = gen_source('source-name' => 'testsuite',
+ 'source-version' => 0,
+ 'control-test' => '');
+test_build_source($dirname);
+
+$dirname = gen_source('source-name' => 'testsuite',
+ 'source-version' => 1,
+ 'control-test' => '');
+test_build_source($dirname);
+
+$dirname = gen_source('source-name' => 'testsuite',
+ 'source-version' => 2,
+ 'source-testsuite' => 'smokepkgtest, unitpkgtest, funcpkgtest',
+ 'control-test' => $tmpl_control_tests);
+test_build_source($dirname);
+
+$dirname = gen_source('source-name' => 'testsuite',
+ 'source-version' => 3);
+test_build_source($dirname);
+
+1;