diff options
Diffstat (limited to 'scripts/t/Dpkg_Changelog.t')
-rw-r--r-- | scripts/t/Dpkg_Changelog.t | 383 |
1 files changed, 383 insertions, 0 deletions
diff --git a/scripts/t/Dpkg_Changelog.t b/scripts/t/Dpkg_Changelog.t new file mode 100644 index 0000000..c3e7413 --- /dev/null +++ b/scripts/t/Dpkg_Changelog.t @@ -0,0 +1,383 @@ +#!/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 => 102; +use Test::Dpkg qw(:paths); + +use File::Basename; + +use Dpkg::File; + +BEGIN { + use_ok('Dpkg::Changelog'); + use_ok('Dpkg::Changelog::Debian'); + use_ok('Dpkg::Vendor', qw(get_current_vendor)); +}; + +my $datadir = test_get_data_path(); + +my $vendor = get_current_vendor(); + +######################### + +foreach my $file ("$datadir/countme", "$datadir/shadow", "$datadir/fields", + "$datadir/regressions", "$datadir/date-format", "$datadir/stop-modeline") { + + my $changes = Dpkg::Changelog::Debian->new(verbose => 0); + $changes->load($file); + + my $content = file_slurp($file); + cmp_ok($content, 'eq', "$changes", "string output of Dpkg::Changelog on $file"); + + my $errors = $changes->get_parse_errors(); + my $basename = basename( $file ); + is($errors, '', "Parse example changelog $file without errors" ); + + my @data = @$changes; + ok(@data, 'data is not empty'); + + if ($file eq "$datadir/countme") { + # test range options + cmp_ok(@data, '==', 7, 'no options -> count'); + my $all_versions = join( '/', map { $_->get_version() } @data); + + sub check_options { + my (%opts) = @_; + + my @cnt = $changes->get_range($opts{range}); + cmp_ok(@cnt, '==', $opts{count}, "$opts{name} -> count"); + if ($opts{count} == @{$opts{data}}) { + is_deeply(\@cnt, $opts{data}, "$opts{name} -> returns all"); + } else { + is_deeply([ map { $_->get_version() } @cnt ], + $opts{versions}, "$opts{name} -> versions" ); + } + } + + my %ref = ( + changes => $changes, + data => \@data, + ); + + check_options(%ref, range => { count => 3 }, + count => 3, + versions => [ '2:2.0-1', '1:2.0~rc2-3', '1:2.0~rc2-2' ], + name => 'positive count'); + check_options(%ref, range => { count => 3, reverse => 1 }, + count => 3, + versions => [ '1:2.0~rc2-2', '1:2.0~rc2-3', '2:2.0-1' ], + name => 'positive reverse count'); + check_options(%ref, range => { count => -3 }, + count => 3, + versions => [ + '1:2.0~rc2-1sarge2', + '1:2.0~rc2-1sarge1', + '1.5-1', + ], + name => 'negative count'); + check_options(%ref, range => { count => 1 }, + count => 1, + versions => [ '2:2.0-1' ], + name => 'count 1'); + check_options(%ref, range => { count => 1, default_all => 1 }, + count => 1, + versions => [ '2:2.0-1' ], + name => 'count 1 (d_a 1)'); + check_options(%ref, range => { count => -1 }, + count => 1, + versions => [ '1.5-1' ], + name => 'count -1'); + + check_options(%ref, range => { count => 3, offset => 2 }, + count => 3, + versions => [ + '1:2.0~rc2-2', + '1:2.0~rc2-1sarge3', + '1:2.0~rc2-1sarge2', + ], + name => 'positive count + positive offset'); + check_options(%ref, range => { count => -3, offset => 4 }, + count => 3, + versions => [ + '1:2.0~rc2-3', + '1:2.0~rc2-2', + '1:2.0~rc2-1sarge3', + ], + name => 'negative count + positive offset'); + + check_options(%ref, range => { count => 4, offset => 5 }, + count => 2, + versions => [ '1:2.0~rc2-1sarge1', '1.5-1' ], + name => 'positive count + positive offset (>max)'); + check_options(%ref, range => { count => -4, offset => 2 }, + count => 2, + versions => [ '2:2.0-1', '1:2.0~rc2-3' ], + name => 'negative count + positive offset (<0)'); + + check_options(%ref, range => { count => 3, offset => -4 }, + count => 3, + versions => [ + '1:2.0~rc2-1sarge3', + '1:2.0~rc2-1sarge2', + '1:2.0~rc2-1sarge1', + ], + name => 'positive count + negative offset'); + check_options(%ref, range => { count => -3, offset => -3 }, + count => 3, + versions => [ + '1:2.0~rc2-3', + '1:2.0~rc2-2', + '1:2.0~rc2-1sarge3', + ], + name => 'negative count + negative offset'); + + check_options(%ref, range => { count => 5, offset => -2 }, + count => 2, + versions => [ '1:2.0~rc2-1sarge1', '1.5-1' ], + name => 'positive count + negative offset (>max)'); + check_options(%ref, range => { count => -5, offset => -4 }, + count => 3, + versions => [ '2:2.0-1', '1:2.0~rc2-3', '1:2.0~rc2-2' ], + name => 'negative count + negative offset (<0)'); + + check_options(%ref, range => { count => 7 }, + count => 7, + name => 'count 7 (max)'); + check_options(%ref, range => { count => -7 }, + count => 7, + name => 'count -7 (-max)'); + check_options(%ref, range => { count => 10 }, + count => 7, + name => 'count 10 (>max)'); + check_options(%ref, range => { count => -10 }, + count => 7, + name => 'count -10 (<-max)'); + + check_options(%ref, range => { from => '1:2.0~rc2-1sarge3' }, + count => 4, + versions => [ + '2:2.0-1', + '1:2.0~rc2-3', + '1:2.0~rc2-2', + '1:2.0~rc2-1sarge3', + ], + name => 'from => "1:2.0~rc2-1sarge3"'); + check_options(%ref, range => { since => '1:2.0~rc2-1sarge3' }, + count => 3, + versions => [ + '2:2.0-1', + '1:2.0~rc2-3', + '1:2.0~rc2-2', + ], + name => 'since => "1:2.0~rc2-1sarge3"'); + $SIG{__WARN__} = sub {}; + check_options(%ref, range => { since => 0 }, + count => 7, + name => 'since => 0 returns all'); + delete $SIG{__WARN__}; + check_options(%ref, range => { to => '1:2.0~rc2-1sarge2' }, + count => 3, + versions => [ + '1:2.0~rc2-1sarge2', + '1:2.0~rc2-1sarge1', + '1.5-1', + ], + name => 'to => "1:2.0~rc2-1sarge2"'); + ## no critic (ControlStructures::ProhibitUntilBlocks) + check_options(%ref, range => { until => '1:2.0~rc2-1sarge2' }, + count => 2, + versions => [ '1:2.0~rc2-1sarge1', '1.5-1' ], + name => 'until => "1:2.0~rc2-1sarge2"'); + ## use critic + #TODO: test combinations + } + if ($file eq "$datadir/fields") { + my $str = $changes->format_range('dpkg', { all => 1 }); + my $expected = 'Source: fields +Version: 2.0-0etch1 +Distribution: stable +Urgency: high +Maintainer: Frank Lichtenheld <frank@lichtenheld.de> +Timestamp: 1200235759 +Date: Sun, 13 Jan 2008 15:49:19 +0100 +Closes: 1000000 1111111 2222222 +Changes: + fields (2.0-0etch1) stable; urgency=low + . + * Upload to stable (Closes: #1111111, #2222222) + * Fix more stuff. (LP: #54321, #2424242) + . + fields (2.0-1) unstable frozen; urgency=medium + . + [ Frank Lichtenheld ] + * Upload to unstable (Closes: #1111111, #2222222) + * Fix stuff. (LP: #12345, #424242) + . + [ Raphaël Hertzog ] + * New upstream release. + - implements a + - implements b + * Update S-V. + . + fields (2.0~b1-1) unstable; urgency=low,xc-userfield=foobar + . + * Beta + . + fields (1.0) experimental; urgency=high,xb-userfield2=foobar + . + * First upload (Closes: #1000000) +Xb-Userfield2: foobar +Xc-Userfield: foobar + +'; + if ($vendor eq 'Ubuntu') { + $expected =~ s/^(Closes:.*)/$1\nLaunchpad-Bugs-Fixed: 12345 54321 424242 2424242/m; + } + cmp_ok($str, 'eq', $expected, 'fields handling'); + + $str = $changes->format_range('dpkg', { offset => 1, count => 2 }); + $expected = 'Source: fields +Version: 2.0-1 +Distribution: unstable frozen +Urgency: medium +Maintainer: Frank Lichtenheld <djpig@debian.org> +Timestamp: 1200149359 +Date: Sun, 12 Jan 2008 15:49:19 +0100 +Closes: 1111111 2222222 +Changes: + fields (2.0-1) unstable frozen; urgency=medium + . + [ Frank Lichtenheld ] + * Upload to unstable (Closes: #1111111, #2222222) + * Fix stuff. (LP: #12345, #424242) + . + [ Raphaël Hertzog ] + * New upstream release. + - implements a + - implements b + * Update S-V. + . + fields (2.0~b1-1) unstable; urgency=low,xc-userfield=foobar + . + * Beta +Xc-Userfield: foobar + +'; + if ($vendor eq 'Ubuntu') { + $expected =~ s/^(Closes:.*)/$1\nLaunchpad-Bugs-Fixed: 12345 424242/m; + } + cmp_ok($str, 'eq', $expected, 'fields handling 2'); + + $str = $changes->format_range('rfc822', { offset => 2, count => 2 }); + $expected = 'Source: fields +Version: 2.0~b1-1 +Distribution: unstable +Urgency: low +Maintainer: Frank Lichtenheld <frank@lichtenheld.de> +Timestamp: 1200062959 +Date: Sun, 11 Jan 2008 15:49:19 +0100 +Changes: + fields (2.0~b1-1) unstable; urgency=low,xc-userfield=foobar + . + * Beta +Xc-Userfield: foobar + +Source: fields +Version: 1.0 +Distribution: experimental +Urgency: high +Maintainer: Frank Lichtenheld <djpig@debian.org> +Timestamp: 1199976559 +Date: Sun, 10 Jan 2008 15:49:19 +0100 +Closes: 1000000 +Changes: + fields (1.0) experimental; urgency=high,xb-userfield2=foobar + . + * First upload (Closes: #1000000) +Xb-Userfield2: foobar + +'; + cmp_ok($str, 'eq', $expected, 'fields handling 3'); + + # Test Dpkg::Changelog::Entry methods + is($data[1]->get_version(), '2.0-1', 'get_version'); + is($data[1]->get_source(), 'fields', 'get_source'); + is(scalar $data[1]->get_distributions(), 'unstable', 'get_distribution'); + is(join('|', $data[1]->get_distributions()), 'unstable|frozen', + 'get_distributions'); + is($data[3]->get_optional_fields(), + "Urgency: high\nCloses: 1000000\nXb-Userfield2: foobar\n", + 'get_optional_fields'); + is($data[1]->get_maintainer(), 'Frank Lichtenheld <djpig@debian.org>', + 'get_maintainer'); + is($data[1]->get_timestamp(), 'Sun, 12 Jan 2008 15:49:19 +0100', + 'get_timestamp'); + my @items = $data[1]->get_change_items(); + is($items[0], " [ Frank Lichtenheld ]\n", 'change items 1'); + is($items[4], ' * New upstream release. + - implements a + - implements b +', 'change items 2'); + is($items[5], " * Update S-V.\n", 'change items 3'); + } + if ($file eq "$datadir/date-format") { + is($data[0]->get_timestamp(), '01 Jul 2100 23:59:59 -1200', + 'get date w/o DoW, and negative timezone offset'); + is($data[1]->get_timestamp(), 'Tue, 27 Feb 2050 12:00:00 +1245', + 'get date w/ DoW, and positive timezone offset'); + is($data[2]->get_timestamp(), 'Mon, 01 Jan 2000 00:00:00 +0000', + 'get date w/ DoW, and zero timezone offset'); + } + if ($file eq "$datadir/stop-modeline") { + is($changes->get_unparsed_tail(), "vim: et\n", + 'get unparsed modeline at EOF'); + } + if ($file eq "$datadir/regressions") { + my $f = ($changes->format_range('dpkg'))[0]; + is("$f->{Version}", '0', 'version 0 correctly parsed'); + } + + SKIP: { + skip('avoid spurious warning with only one entry', 2) + if @data == 1; + + my $str; + my $oldest_version = $data[-1]->{Version}; + $str = $changes->format_range('dpkg', { since => $oldest_version }); + + $str = $changes->format_range('rfc822'); + + ok(1, 'TODO check rfc822 output'); + + $str = $changes->format_range('rfc822', { since => $oldest_version }); + + ok(1, 'TODO check rfc822 output with ranges'); + } +} + +foreach my $test (([ "$datadir/misplaced-tz", 6 ], + [ "$datadir/unreleased", 5, 7 ])) { + + my $file = shift @$test; + my $changes = Dpkg::Changelog::Debian->new(verbose => 0); + $changes->load($file); + my @errors = $changes->get_parse_errors(); + + ok(@errors, 'errors occured'); + is_deeply( [ map { $_->[1] } @errors ], $test, 'check line numbers' ); +} |