diff options
Diffstat (limited to 'scripts/t/Dpkg_Dist_Files.t')
-rw-r--r-- | scripts/t/Dpkg_Dist_Files.t | 214 |
1 files changed, 214 insertions, 0 deletions
diff --git a/scripts/t/Dpkg_Dist_Files.t b/scripts/t/Dpkg_Dist_Files.t new file mode 100644 index 0000000..7e820b5 --- /dev/null +++ b/scripts/t/Dpkg_Dist_Files.t @@ -0,0 +1,214 @@ +#!/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 tests => 26; +use Test::Dpkg qw(:paths); + +use_ok('Dpkg::Dist::Files'); + +my $datadir = test_get_data_path(); + +my $expected; +my %expected = ( + 'pkg-src_4:2.0+1A~rc1-1.dsc' => { + filename => 'pkg-src_4:2.0+1A~rc1-1.dsc', + section => 'source', + priority => 'extra', + attrs => {}, + }, + 'pkg-src_4:2.0+1A~rc1-1.tar.xz' => { + filename => 'pkg-src_4:2.0+1A~rc1-1.tar.xz', + section => 'source', + priority => 'extra', + attrs => {}, + }, + 'pkg-templ_1.2.3_arch.type' => { + filename => 'pkg-templ_1.2.3_arch.type', + package => 'pkg-templ', + package_type => 'type', + version => '1.2.3', + arch => 'arch', + section => 'section', + priority => 'priority', + attrs => {}, + }, + 'pkg-arch_2.0.0_amd64.deb' => { + filename => 'pkg-arch_2.0.0_amd64.deb', + package => 'pkg-arch', + package_type => 'deb', + version => '2.0.0', + arch => 'amd64', + section => 'admin', + priority => 'required', + attrs => {}, + }, + 'pkg-indep_0.0.1-2_all.deb' => { + filename => 'pkg-indep_0.0.1-2_all.deb', + package => 'pkg-indep', + package_type => 'deb', + version => '0.0.1-2', + arch => 'all', + section => 'net', + priority => 'standard', + attrs => {}, + }, + 'other_0.txt' => { + filename => 'other_0.txt', + section => 'text', + priority => 'optional', + attrs => { + 'mime-type' => 'text/plain', + }, + }, + 'BY-HAND-file' => { + filename => 'BY-HAND-file', + section => 'webdocs', + priority => 'optional', + attrs => { + 'by-hand' => 'true' + }, + }, + 'another:filename' => { + filename => 'another:filename', + section => 'by-hand', + priority => 'extra', + attrs => {}, + }, + 'added-on-the-fly' => { + filename => 'added-on-the-fly', + section => 'void', + priority => 'wish', + attrs => {}, + }, +); + +my $dist = Dpkg::Dist::Files->new(); +$dist->load("$datadir/files-byhand") or error('cannot parse file'); + +$expected = <<'FILES'; +BY-HAND-file webdocs optional by-hand=true +other_0.txt text optional mime-type=text/plain +pkg-arch_2.0.0_amd64.deb admin required +pkg-indep_0.0.1-2_all.deb net standard +pkg-templ_1.2.3_arch.type section priority +FILES + +is($dist->output(), $expected, 'Parsed dist file'); +foreach my $f ($dist->get_files()) { + my $filename = $f->{filename}; + + is_deeply($f, $expected{$filename}, + "Detail for individual dist file $filename, via get_files()"); + + my $fs = $dist->get_file($filename); + is_deeply($fs, $expected{$filename}, + "Detail for individual dist file $filename, via get_file()"); +} + +is($dist->parse_filename('file%invalid'), undef, 'invalid filename'); + +$expected = <<'FILES'; +BY-HAND-file webdocs optional by-hand=true +added-on-the-fly void wish +other_0.txt text optional mime-type=text/plain +pkg-arch_2.0.0_amd64.deb void imperative +pkg-templ_1.2.3_arch.type section priority +FILES + +$dist->add_file('added-on-the-fly', 'void', 'wish'); +is_deeply($dist->get_file('added-on-the-fly'), $expected{'added-on-the-fly'}, + 'Get added file added-on-the-fly'); + +$dist->add_file('pkg-arch_2.0.0_amd64.deb', 'void', 'imperative'); +my %expected_pkg_arch = %{$expected{'pkg-arch_2.0.0_amd64.deb'}}; +$expected_pkg_arch{section} = 'void'; +$expected_pkg_arch{priority} = 'imperative'; +is_deeply($dist->get_file('pkg-arch_2.0.0_amd64.deb'), \%expected_pkg_arch, + 'Get modified file pkg-arch_2.0.0_amd64.deb'); + +$dist->del_file('pkg-indep_0.0.1-2_all.deb'); +is($dist->get_file('unknown'), undef, 'Get unknown file'); +is($dist->get_file('pkg-indep_0.0.1-2_all.deb'), undef, 'Get deleted file'); +is($dist->output(), $expected, 'Modified dist object'); + +$expected = <<'FILES'; +another:filename by-hand extra +pkg-src_4:2.0+1A~rc1-1.dsc source extra +pkg-src_4:2.0+1A~rc1-1.tar.xz source extra +FILES + +$dist->reset(); +$dist->add_file('pkg-src_4:2.0+1A~rc1-1.dsc', 'source', 'extra'); +$dist->add_file('pkg-src_4:2.0+1A~rc1-1.tar.xz', 'source', 'extra'); +$dist->add_file('another:filename', 'by-hand', 'extra'); + +is_deeply($dist->get_file('pkg-src_4:2.0+1A~rc1-1.dsc'), + $expected{'pkg-src_4:2.0+1A~rc1-1.dsc'}, + 'Get added file pkg-src_4:2.0+1A~rc1-1.dsc'); +is_deeply($dist->get_file('pkg-src_4:2.0+1A~rc1-1.tar.xz'), + $expected{'pkg-src_4:2.0+1A~rc1-1.tar.xz'}, + 'Get added file pkg-src_4:2.0+1A~rc1-1.tar.xz'); +is_deeply($dist->get_file('another:filename'), + $expected{'another:filename'}, + 'Get added file another:filename'); +is($dist->output, $expected, 'Added source files'); + +$expected = <<'FILES'; +BY-HAND-file webdocs optional by-hand=true +other_0.txt text optional mime-type=text/plain +pkg-arch_2.0.0_amd64.deb admin required +pkg-frag-a_0.0_arch.type section priority +pkg-frag-b_0.0_arch.type section priority +pkg-indep_0.0.1-2_all.deb net standard +pkg-templ_1.2.3_arch.type section priority +FILES + +$dist->reset(); +$dist->load_dir($datadir) or error('cannot parse fragment files'); +is($dist->output(), $expected, 'Parse fragment directory'); + +$expected = <<'FILES'; +pkg-arch_2.0.0_amd64.deb admin required +pkg-indep_0.0.1-2_all.deb net standard +pkg-templ_1.2.3_arch.type section priority +FILES + +$dist->reset(); +$dist->load("$datadir/files-byhand") or error('cannot parse file'); +$dist->filter(remove => sub { $_[0]->{priority} eq 'optional' }); +is($dist->output(), $expected, 'Filter remove priority optional'); + +$expected = <<'FILES'; +BY-HAND-file webdocs optional by-hand=true +other_0.txt text optional mime-type=text/plain +FILES + +$dist->reset(); +$dist->load("$datadir/files-byhand") or error('cannot parse file'); +$dist->filter(keep => sub { $_[0]->{priority} eq 'optional' }); +is($dist->output(), $expected, 'Filter keep priority optional'); + +$expected = <<'FILES'; +BY-HAND-file webdocs optional by-hand=true +FILES + +$dist->reset(); +$dist->load("$datadir/files-byhand") or error('cannot parse file'); +$dist->filter(remove => sub { $_[0]->{section} eq 'text' }, + keep => sub { $_[0]->{priority} eq 'optional' }); +is($dist->output(), $expected, 'Filter remove section text, keep priority optional'); |