summaryrefslogtreecommitdiffstats
path: root/scripts/t/Dpkg_Control_Fields.t
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 14:58:51 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 14:58:51 +0000
commitcbffab246997fb5a06211dfb706b54e5ae5bb59f (patch)
tree0573c5d96f58d74d76a49c0f2a70398e389a36d3 /scripts/t/Dpkg_Control_Fields.t
parentInitial commit. (diff)
downloaddpkg-upstream.tar.xz
dpkg-upstream.zip
Adding upstream version 1.21.22.upstream/1.21.22upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'scripts/t/Dpkg_Control_Fields.t')
-rw-r--r--scripts/t/Dpkg_Control_Fields.t540
1 files changed, 540 insertions, 0 deletions
diff --git a/scripts/t/Dpkg_Control_Fields.t b/scripts/t/Dpkg_Control_Fields.t
new file mode 100644
index 0000000..1c699e3
--- /dev/null
+++ b/scripts/t/Dpkg_Control_Fields.t
@@ -0,0 +1,540 @@
+#!/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(:paths);
+
+BEGIN {
+ plan tests => 2603;
+
+ use_ok('Dpkg::Control::Types');
+ use_ok('Dpkg::Control::FieldsCore');
+ use_ok('Dpkg::Control');
+}
+
+#my $datadir = test_get_data_path();
+
+my @src_dep_fields = qw(
+ Build-Depends
+ Build-Depends-Arch
+ Build-Depends-Indep
+ Build-Conflicts
+ Build-Conflicts-Arch
+ Build-Conflicts-Indep
+);
+my @bin_dep_normal_fields = qw(
+ Pre-Depends
+ Depends
+ Recommends
+ Suggests
+ Enhances
+);
+my @bin_dep_union_fields = qw(
+ Conflicts
+ Breaks
+ Replaces
+ Provides
+ Built-Using
+ Static-Built-Using
+);
+my @bin_dep_fields = (
+ @bin_dep_normal_fields,
+ @bin_dep_union_fields,
+);
+my @src_checksums = qw(
+ Checksums-Md5
+ Checksums-Sha1
+ Checksums-Sha256
+);
+my @bin_checksums = qw(
+ MD5sum
+ SHA1
+ SHA256
+);
+my @src_files = (
+ @src_checksums,
+ qw(
+ Files
+ ),
+);
+my @bin_files = (
+ qw(
+ Filename
+ Size
+ ),
+ @bin_checksums,
+);
+my @vcs_fields = qw(
+ Vcs-Browser
+ Vcs-Arch
+ Vcs-Bzr
+ Vcs-Cvs
+ Vcs-Darcs
+ Vcs-Git
+ Vcs-Hg
+ Vcs-Mtn
+ Vcs-Svn
+);
+my @test_fields = qw(
+ Testsuite
+ Testsuite-Triggers
+);
+
+my %fields = (
+ CTRL_INFO_SRC() => {
+ name => 'debian/control source stanza',
+ fields => [
+ qw(
+ Source
+ Section
+ Priority
+ Maintainer
+ Uploaders
+ Origin
+ Bugs
+ ),
+ @vcs_fields,
+ qw(
+ Homepage
+ Standards-Version
+ Rules-Requires-Root
+ ),
+ @src_dep_fields,
+ @test_fields,
+ qw(
+ Description
+ ),
+ ],
+ },
+ CTRL_INFO_PKG() => {
+ name => 'debian/control binary stanza',
+ fields => [
+ qw(
+ Package
+ Package-Type
+ Section
+ Priority
+ Architecture
+ Subarchitecture
+ Multi-Arch
+ Essential
+ Protected
+ Build-Essential
+ Build-Profiles
+ Built-For-Profiles
+ Kernel-Version
+ ),
+ @bin_dep_fields,
+ qw(
+ Homepage
+ Installer-Menu-Item
+ Task
+ Tag
+ Description
+ ),
+ ],
+ },
+ CTRL_PKG_SRC() => {
+ name => '.dsc',
+ fields => [
+ qw(
+ Format
+ Source
+ Binary
+ Architecture
+ Version
+ Origin
+ Maintainer
+ Uploaders
+ Homepage
+ Description
+ Standards-Version
+ ),
+ @vcs_fields,
+ @test_fields,
+ @src_dep_fields,
+ qw(
+ Package-List
+ ),
+ @src_files,
+ ],
+ },
+ CTRL_PKG_DEB() => {
+ name => 'DEBIAN/control',
+ fields => [
+ qw(
+ Package
+ Package-Type
+ Source
+ Version
+ Kernel-Version
+ Built-For-Profiles
+ Auto-Built-Package
+ Architecture
+ Subarchitecture
+ Installer-Menu-Item
+ Build-Essential
+ Essential
+ Protected
+ Origin
+ Bugs
+ Maintainer
+ Installed-Size
+ ),
+ @bin_dep_fields,
+ qw(
+ Section
+ Priority
+ Multi-Arch
+ Homepage
+ Description
+ Tag
+ Task
+ ),
+ ],
+ },
+ CTRL_INDEX_SRC() => {
+ name => 'Sources',
+ fields => [
+ qw(
+ Format
+ Package
+ Binary
+ Architecture
+ Version
+ Priority
+ Section
+ Origin
+ Maintainer
+ Uploaders
+ Homepage
+ Description
+ Standards-Version
+ ),
+ @vcs_fields,
+ @test_fields,
+ @src_dep_fields,
+ qw(
+ Package-List
+ Directory
+ ),
+ @src_files,
+ ],
+ },
+ CTRL_INDEX_PKG() => {
+ name => 'Packages',
+ fields => [
+ qw(
+ Package
+ Package-Type
+ Source
+ Version
+ Kernel-Version
+ Built-For-Profiles
+ Auto-Built-Package
+ Architecture
+ Subarchitecture
+ Installer-Menu-Item
+ Build-Essential
+ Essential
+ Protected
+ Origin
+ Bugs
+ Maintainer
+ Installed-Size
+ ),
+ @bin_dep_fields,
+ @bin_files,
+ qw(
+ Section
+ Priority
+ Multi-Arch
+ Homepage
+ Description
+ Tag
+ Task
+ ),
+ ],
+ },
+ CTRL_REPO_RELEASE() => {
+ name => 'Release',
+ fields => [
+ qw(
+ Origin
+ Label
+ Suite
+ Version
+ Codename
+ Changelogs
+ Date
+ Valid-Until
+ NotAutomatic
+ ButAutomaticUpgrades
+ Acquire-By-Hash
+ No-Support-for-Architecture-all
+ Architectures
+ Components
+ Description
+ ),
+ @bin_checksums,
+ ],
+ },
+ CTRL_CHANGELOG() => {
+ name => 'debian/changelog',
+ fields => [
+ qw(
+ Source
+ Binary-Only
+ Version
+ Distribution
+ Urgency
+ Maintainer
+ Timestamp
+ Date
+ Closes
+ Changes
+ ),
+ ],
+ },
+ CTRL_COPYRIGHT_HEADER() => {
+ name => 'debian/copyright Format stanza',
+ fields => [
+ qw(
+ Format
+ Upstream-Name
+ Upstream-Contact
+ Source
+ Disclaimer
+ Comment
+ License
+ Copyright
+ ),
+ ],
+ },
+ CTRL_COPYRIGHT_FILES() => {
+ name => 'debian/copyright Files stanza',
+ fields => [
+ qw(
+ Files
+ Copyright
+ License
+ Comment
+ ),
+ ],
+ },
+ CTRL_COPYRIGHT_LICENSE() => {
+ name => 'debian/copyright License stanza',
+ fields => [
+ qw(
+ License
+ Comment
+ ),
+ ],
+ },
+ CTRL_TESTS() => {
+ name => 'debian/tests/control',
+ fields => [
+ qw(
+ Test-Command
+ Tests
+ Tests-Directory
+ Architecture
+ Restrictions
+ Features
+ Classes
+ Depends
+ ),
+ ],
+ },
+ CTRL_FILE_BUILDINFO() => {
+ name => '.buildinfo',
+ fields => [
+ qw(
+ Format
+ Source
+ Binary
+ Architecture
+ Version
+ Binary-Only-Changes
+ ),
+ @src_checksums,
+ qw(
+ Build-Origin
+ Build-Architecture
+ Build-Kernel-Version
+ Build-Date
+ Build-Path
+ Build-Tainted-By
+ Installed-Build-Depends
+ Environment
+ ),
+ ],
+ },
+ CTRL_FILE_CHANGES() => {
+ name => '.changes',
+ fields => [
+ qw(
+ Format
+ Date
+ Source
+ Binary
+ Binary-Only
+ Built-For-Profiles
+ Architecture
+ Version
+ Distribution
+ Urgency
+ Maintainer
+ Changed-By
+ Description
+ Closes
+ Changes
+ ),
+ @src_files,
+ ],
+ },
+ CTRL_FILE_VENDOR() => {
+ name => 'dpkg origin',
+ fields => [
+ qw(
+ Vendor
+ Vendor-Url
+ Bugs
+ Parent
+ ),
+ ],
+ },
+ CTRL_FILE_STATUS() => {
+ name => 'dpkg status',
+ fields => [
+ qw(
+ Package
+ Essential
+ Protected
+ Status
+ Priority
+ Section
+ Installed-Size
+ Origin
+ Maintainer
+ Bugs
+ Architecture
+ Multi-Arch
+ Source
+ Version
+ Config-Version
+ Replaces
+ Provides
+ Depends
+ Pre-Depends
+ Recommends
+ Suggests
+ Breaks
+ Conflicts
+ Enhances
+ Conffiles
+ Description
+ Triggers-Pending
+ Triggers-Awaited
+ Auto-Built-Package
+ Build-Essential
+ Built-For-Profiles
+ Built-Using
+ Static-Built-Using
+ Homepage
+ Installer-Menu-Item
+ Kernel-Version
+ Package-Type
+ Subarchitecture
+ Tag
+ Task
+ ),
+ ],
+ },
+);
+
+is_deeply([ field_list_src_dep() ],
+ [ @src_dep_fields ],
+ 'List of build dependencies');
+is_deeply([ field_list_pkg_dep() ],
+ [ @bin_dep_fields ],
+ 'List of build dependencies');
+
+is(field_capitalize('invented-field'), 'Invented-Field',
+ 'Field Invented-Field capitalization');
+ok(!field_is_official('invented-field'),
+ 'Field Invented-Field is not official');
+
+my %known_fields;
+foreach my $type (sort keys %fields) {
+ if (not $fields{$type}->{unordered}) {
+ is_deeply([ field_ordered_list($type) ], $fields{$type}->{fields},
+ "List of $fields{$type}->{name} fields");
+ }
+
+ foreach my $field (@{$fields{$type}->{fields}}) {
+ $known_fields{$field} = 1;
+ }
+}
+
+foreach my $field (sort keys %known_fields) {
+ is(field_capitalize($field), $field, "Field $field capitalization");
+ is(field_capitalize(lc $field), $field, "Field lc($field) capitalization");
+ is(field_capitalize(uc $field), $field, "Field uc($field) capitalization");
+
+ ok(field_is_official($field), "Field $field is official");
+ ok(field_is_official(lc $field), "Field lc($field) is official");
+ ok(field_is_official(uc $field), "Field uc($field) is official");
+}
+
+foreach my $type (sort keys %fields) {
+ my %allowed_fields = map { $_ => 1 } @{$fields{$type}->{fields}};
+
+ foreach my $field (sort keys %known_fields) {
+ if ($allowed_fields{$field}) {
+ ok(field_is_allowed_in($field, $type),
+ "Field $field allowed for type $fields{$type}->{name}");
+ } else {
+ ok(!field_is_allowed_in($field, $type),
+ "Field $field not allowed for type $fields{$type}->{name}");
+ }
+ }
+}
+
+# Check deb822 field parsers
+
+my $ctrl = Dpkg::Control->new(type => CTRL_PKG_DEB);
+
+my ($source, $version);
+
+$ctrl->{Package} = 'test-binary';
+$ctrl->{Version} = '2.0-1';
+$ctrl->{Source} = 'test-source (1.0)';
+($source, $version) = field_parse_binary_source($ctrl);
+is($source, 'test-source', 'Source package from binary w/ Source field');
+is($version, '1.0', 'Source version from binary w/ Source field');
+
+$ctrl->{Source} = 'test-source';
+($source, $version) = field_parse_binary_source($ctrl);
+is($source, 'test-source', 'Source package from binary w/ Source field w/o version');
+is($version, '2.0-1', 'Source version from binary w/ Source field w/o version');
+
+delete $ctrl->{Source};
+($source, $version) = field_parse_binary_source($ctrl);
+is($source, 'test-binary', 'Source package from binary w/o Source field');
+is($version, '2.0-1', 'Source version from binary w/o Source field');