From 9a08cbfcc1ef900a04580f35afe2a4592d7d6030 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Mon, 6 May 2024 02:45:20 +0200 Subject: Adding upstream version 1.19.8. Signed-off-by: Daniel Baumann --- t/codespell.t | 63 +++++++++++++++++++++++ t/codespell/stopwords | 28 ++++++++++ t/cppcheck.t | 45 ++++++++++++++++ t/cppcheck/cppcheck.supp | 54 +++++++++++++++++++ t/critic.t | 131 +++++++++++++++++++++++++++++++++++++++++++++++ t/critic/perlcriticrc | 129 ++++++++++++++++++++++++++++++++++++++++++++++ t/minimum-version.t | 32 ++++++++++++ t/module-version.t | 73 ++++++++++++++++++++++++++ t/po.t | 51 ++++++++++++++++++ t/pod-coverage.t | 77 ++++++++++++++++++++++++++++ t/pod-spell.t | 94 ++++++++++++++++++++++++++++++++++ t/pod.t | 27 ++++++++++ t/shellcheck.t | 70 +++++++++++++++++++++++++ t/strict.t | 34 ++++++++++++ t/synopsis.t | 32 ++++++++++++ t/syntax.t | 48 +++++++++++++++++ 16 files changed, 988 insertions(+) create mode 100644 t/codespell.t create mode 100644 t/codespell/stopwords create mode 100644 t/cppcheck.t create mode 100644 t/cppcheck/cppcheck.supp create mode 100644 t/critic.t create mode 100644 t/critic/perlcriticrc create mode 100644 t/minimum-version.t create mode 100644 t/module-version.t create mode 100644 t/po.t create mode 100644 t/pod-coverage.t create mode 100644 t/pod-spell.t create mode 100644 t/pod.t create mode 100644 t/shellcheck.t create mode 100644 t/strict.t create mode 100644 t/synopsis.t create mode 100644 t/syntax.t (limited to 't') diff --git a/t/codespell.t b/t/codespell.t new file mode 100644 index 0000000..101b00b --- /dev/null +++ b/t/codespell.t @@ -0,0 +1,63 @@ +#!/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 . + +use strict; +use warnings; + +use Test::More; +use Test::Dpkg qw(:needs); + +test_needs_author(); +test_needs_command('codespell'); +test_needs_srcdir_switch(); + +plan tests => 1; + +my @codespell_skip = qw( + .git + *.po + *.pot + *.gmo + *.add + *.cache + ChangeLog + Makefile.in + Makefile + configure + libtool + libtool.m4 + aclocal.m4 +); +my $codespell_skip = join ',', @codespell_skip; + +my @codespell_opts = (qw( + --ignore-words=t/codespell/stopwords +), ( + "--skip=$codespell_skip" +)); +my $tags = qx(codespell @codespell_opts 2>&1); + +# Fixup the output: +$tags =~ s/^WARNING: Binary file:.*\n//mg; +$tags =~ s{^\./build-aux/.*\n}{}mg; +$tags =~ s{^\./man/[a-zA-Z_]+/.*\n}{}mg; +chomp $tags; + +my $ok = length $tags == 0; + +ok($ok, 'codespell'); +if (not $ok) { + diag($tags); +} diff --git a/t/codespell/stopwords b/t/codespell/stopwords new file mode 100644 index 0000000..75dcb17 --- /dev/null +++ b/t/codespell/stopwords @@ -0,0 +1,28 @@ +accreting +ba +cas +chage +chang +claus +cmo +creat +files' +finitel +fo +iff +isnt +ist +ists +lowercased +mitre +msdos +objext +od +packages' +process' +readded +rela +te +thru +ths +troup diff --git a/t/cppcheck.t b/t/cppcheck.t new file mode 100644 index 0000000..696b6b0 --- /dev/null +++ b/t/cppcheck.t @@ -0,0 +1,45 @@ +#!/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 . + +use strict; +use warnings; + +use Test::More; +use Test::Dpkg qw(:needs); + +test_needs_author(); +test_needs_command('cppcheck'); +test_needs_srcdir_switch(); + +plan tests => 1; + +my @cppcheck_opts = (qw( + -q --force --error-exitcode=2 + --suppressions-list=t/cppcheck/cppcheck.supp +), ( + '--enable=warning,performance,portability,style', + '--template=\'{file}:{line}: {severity} ({id}): {message}\'' +)); +my $tags = qx(cppcheck @cppcheck_opts . 2>&1); + +# Fixup the output: +chomp $tags; + +my $ok = length $tags == 0; + +ok($ok, 'cppcheck'); +if (not $ok) { + diag($tags); +} diff --git a/t/cppcheck/cppcheck.supp b/t/cppcheck/cppcheck.supp new file mode 100644 index 0000000..6dcb193 --- /dev/null +++ b/t/cppcheck/cppcheck.supp @@ -0,0 +1,54 @@ +// +// Suppression file for cppcheck. +/// + +// We assume that the system has a sane NULL definition. +varFuncNullUB + +// TODO: While perhaps valid there are many to handle right away. +variableScope + +// Ignore, this is an imported module. +unusedStructMember:lib/compat/obstack.c +nullPointerArithmetic:lib/compat/obstack.c + +// Ignore, we are testing the functions. +knownConditionTrueFalse:lib/dpkg/t/t-macros.c + +// Ignore, we use our own test assertions macros. +literalWithCharPtrCompare:lib/dpkg/t/t-test.c + +// Ignore, the code is used only for its binary artifacts. +uninitMemberVar:*/Dpkg_Shlibs/patterns.cpp + +// BUG: False positive. +knownConditionTrueFalse:src/depcon.c:585 +knownConditionTrueFalse:src/depcon.c:668 + +// BUG: False positive, the loop does an early exit. +identicalInnerCondition:lib/dpkg/fsys-hash.c:100 + +// BUG: False positive, this is an enum not a boolean. +redundantCondition:utils/update-alternatives.c:2711 + +// BUG: False positive, the macros from lib/dpkg/dlist.h use the tail member. +unusedStructMember:lib/dpkg/triglib.c:378 + +// BUG: False positive, does not understand must-allocate functions. +nullPointer:src/unpack.c:195 + +// BUG: False positive, does not understand setjmp-style error handling. +redundantAssignment:lib/compat/selinux.c:73 +redundantAssignment:lib/dpkg/t/t-ehandle.c:108 +uninitStructMember:utils/update-alternatives.c:1305 +uninitStructMember:utils/update-alternatives.c:1306 +uninitStructMember:utils/update-alternatives.c:1307 + +// BUG: False positive, does not understand ohshit(), ohshite() and +// bad_format as error terminators. +doubleFree:src/script.c +doubleFree:utils/update-alternatives.c:1213 +va_end_missing:lib/dpkg/parsehelp.c:68 + +// BUG: False positive, the code uses va_copy(). +va_list_usedBeforeStarted:lib/compat/vasprintf.c diff --git a/t/critic.t b/t/critic.t new file mode 100644 index 0000000..acb841f --- /dev/null +++ b/t/critic.t @@ -0,0 +1,131 @@ +#!/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 . + +use strict; +use warnings; + +use Test::More; +use Test::Dpkg qw(:needs); + +test_needs_author(); +test_needs_module('Test::Perl::Critic'); +test_needs_srcdir_switch(); + +my @policies = qw( + BuiltinFunctions::ProhibitBooleanGrep + BuiltinFunctions::ProhibitLvalueSubstr + BuiltinFunctions::ProhibitReverseSortBlock + BuiltinFunctions::ProhibitSleepViaSelect + BuiltinFunctions::ProhibitStringySplit + BuiltinFunctions::ProhibitUniversalCan + BuiltinFunctions::ProhibitUniversalIsa + BuiltinFunctions::ProhibitUselessTopic + BuiltinFunctions::ProhibitVoidGrep + BuiltinFunctions::ProhibitVoidMap + BuiltinFunctions::RequireBlockGrep + BuiltinFunctions::RequireBlockMap + BuiltinFunctions::RequireGlobFunction + BuiltinFunctions::RequireSimpleSortBlock + ClassHierarchies::ProhibitAutoloading + ClassHierarchies::ProhibitExplicitISA + ClassHierarchies::ProhibitOneArgBless + CodeLayout::ProhibitHardTabs + CodeLayout::ProhibitQuotedWordLists + CodeLayout::ProhibitTrailingWhitespace + CodeLayout::RequireConsistentNewlines + ControlStructures::ProhibitCStyleForLoops + ControlStructures::ProhibitLabelsWithSpecialBlockNames + ControlStructures::ProhibitMutatingListFunctions + ControlStructures::ProhibitNegativeExpressionsInUnlessAndUntilConditions + ControlStructures::ProhibitUntilBlocks + Documentation::RequirePackageMatchesPodName + Documentation::RequirePodSections + InputOutput::ProhibitBarewordFileHandles + InputOutput::ProhibitInteractiveTest + InputOutput::ProhibitJoinedReadline + InputOutput::ProhibitOneArgSelect + InputOutput::ProhibitReadlineInForLoop + InputOutput::ProhibitTwoArgOpen + InputOutput::RequireBracedFileHandleWithPrint + InputOutput::RequireCheckedOpen + InputOutput::RequireEncodingWithUTF8Layer + Miscellanea::ProhibitFormats + Miscellanea::ProhibitTies + Miscellanea::ProhibitUnrestrictedNoCritic + Miscellanea::ProhibitUselessNoCritic + Modules::ProhibitConditionalUseStatements + Modules::ProhibitEvilModules + Modules::RequireBarewordIncludes + Modules::RequireEndWithOne + Modules::RequireExplicitPackage + Modules::RequireFilenameMatchesPackage + NamingConventions::Capitalization + Objects::ProhibitIndirectSyntax + RegularExpressions::ProhibitSingleCharAlternation + RegularExpressions::ProhibitUnusedCapture + RegularExpressions::ProhibitUnusualDelimiters + RegularExpressions::ProhibitUselessTopic + RegularExpressions::RequireBracesForMultiline + RegularExpressions::RequireExtendedFormatting + Subroutines::ProhibitAmpersandSigils + Subroutines::ProhibitExplicitReturnUndef + Subroutines::ProhibitManyArgs + Subroutines::ProhibitNestedSubs + Subroutines::ProhibitReturnSort + Subroutines::ProhibitUnusedPrivateSubroutines + Subroutines::ProtectPrivateSubs + TestingAndDebugging::ProhibitNoStrict + TestingAndDebugging::ProhibitNoWarnings + TestingAndDebugging::RequireTestLabels + TestingAndDebugging::RequireUseStrict + TestingAndDebugging::RequireUseWarnings + ValuesAndExpressions::ProhibitCommaSeparatedStatements + ValuesAndExpressions::ProhibitComplexVersion + ValuesAndExpressions::ProhibitInterpolationOfLiterals + ValuesAndExpressions::ProhibitLongChainsOfMethodCalls + ValuesAndExpressions::ProhibitMismatchedOperators + ValuesAndExpressions::ProhibitMixedBooleanOperators + ValuesAndExpressions::ProhibitQuotesAsQuotelikeOperatorDelimiters + ValuesAndExpressions::ProhibitSpecialLiteralHeredocTerminator + ValuesAndExpressions::ProhibitVersionStrings + ValuesAndExpressions::RequireConstantVersion + ValuesAndExpressions::RequireQuotedHeredocTerminator + ValuesAndExpressions::RequireUpperCaseHeredocTerminator + Variables::ProhibitAugmentedAssignmentInDeclaration + Variables::ProhibitConditionalDeclarations + Variables::ProhibitLocalVars + Variables::ProhibitMatchVars + Variables::ProhibitPackageVars + Variables::ProhibitPerl4PackageNames + Variables::ProhibitUnusedVariables + Variables::ProtectPrivateVars + Variables::RequireLexicalLoopIterators + Variables::RequireNegativeIndices +); + +Test::Perl::Critic->import( + -profile => 't/critic/perlcriticrc', + -verbose => 8, + -include => \@policies, + -only => 1, +); + +my @files = Test::Dpkg::all_perl_files(); + +plan tests => scalar @files; + +for my $file (@files) { + critic_ok($file); +} diff --git a/t/critic/perlcriticrc b/t/critic/perlcriticrc new file mode 100644 index 0000000..990462f --- /dev/null +++ b/t/critic/perlcriticrc @@ -0,0 +1,129 @@ +## Perl Critic configuration file +severity = 1 +verbose = %f %l:%c (Severity: %s)\n %P (%s)\n near '%r'\n%d\n +program-extensions = .pl .t + +## +## Tune tests +## + +[Documentation::RequirePodSections] +lib_sections = NAME | DESCRIPTION | CHANGES +script_sections = NAME | SYNOPSIS | DESCRIPTION + +[RegularExpressions::ProhibitUnusualDelimiters] +allow_all_brackets = 1 + +[RegularExpressions::RequireBracesForMultiline] +allow_all_brackets = 1 + +[RegularExpressions::RequireExtendedFormatting] +minimum_regex_length_to_complain_about = 60 + +[ValuesAndExpressions::ProhibitInterpolationOfLiterals] +# TODO: switch these to q{} ? +allow_if_string_contains_single_quote = 1 + +## +## Disable tests +## + +# Here complex is meant as long, but long is not necessarily complex. +[-BuiltinFunctions::ProhibitComplexMappings] + +# Needed when generating code. +[-BuiltinFunctions::ProhibitStringyEval] + +# BUG: Bogus check. +[-Documentation::PodSpelling] + +# While this might be good for performance, it is bad for keeping docs updated. +[-Documentation::RequirePodAtEnd] + +# BUG: Bogus check. +[-Documentation::RequirePodLinksIncludeText] + +# Too many false positives. +[-CodeLayout::RequireTidyCode] + +# Forcing this just turns into noise (depending on the context, it makes sense). +[-CodeLayout::RequireTrailingCommas] + +# These are fine. +[-ControlStructures::ProhibitCascadingIfElse] + +# These are fine, too many in the code base anyway. +[-ControlStructures::ProhibitPostfixControls] + +# These are fine, usually as long as they are not double negations. +[-ControlStructures::ProhibitUnlessBlocks] + +# BUG: Too many false positives. +[-ControlStructures::ProhibitUnreachableCode] + +# TODO: Check it out, add new Dpkg::Program module? +[-InputOutput::ProhibitBacktickOperators] + +# Needed, using <>/<@ARGV> is not correct, Prompt is not a core module. +[-InputOutput::ProhibitExplicitStdin] + +# TODO: Maybe, some of these are part of the public/current API. +[-Modules::ProhibitAutomaticExportation] + +# Here complex is meant as long, but long is not necessarily complex. +[-Modules::ProhibitExcessMainComplexity] + +# BUG: Too many false positives; non-modules all trigger. +[-Modules::RequireVersionVar] + +# These are fine. +[-NamingConventions::ProhibitAmbiguousNames] + +# We work primarily with ASCII, so we need to specify the exact characters +# to match. +[-RegularExpressions::ProhibitEnumeratedClasses] + +# When . is used in the code it means what it does. +[-RegularExpressions::RequireDotMatchAnything] + +# When ^ or $ are used in the code they mean what they do. +[-RegularExpressions::RequireLineBoundaryMatching] + +# TODO: While valid, these are part of the public/current API. +[-Subroutines::ProhibitBuiltinHomonyms] + +# Needed. +[-Subroutines::ProhibitSubroutinePrototypes] + +# Adding these seems like more noise. +[-Subroutines::RequireFinalReturn] + +# Readers need to know perl, English module is worse. +[-Variables::ProhibitPunctuationVars] + +# Readers need to know perl. +[-Variables::RequireInitializationForLocalVars] + +# BUG: Too many false positives; on ::main and for $ENV, $SIG, $?, $a, $b. +[-Variables::RequireLocalizedPunctuationVars] + +# Readonly is not a core module. +[-ValuesAndExpressions::ProhibitConstantPragma] + +# TODO: Check it out, using other quotes might be less readable and uniform. +[-ValuesAndExpressions::ProhibitEmptyQuotes] + +# Using charnames is less clear. +[-ValuesAndExpressions::ProhibitEscapedCharacters] + +# Used for help output. +[-ValuesAndExpressions::ProhibitImplicitNewlines] + +# Octals are fine. +[-ValuesAndExpressions::ProhibitLeadingZeros] + +# TODO: Check it out, some magic numbers are fine, octals for example. +[-ValuesAndExpressions::ProhibitMagicNumbers] + +# BUG: False positives on long hex numbers, even when separated. +[-ValuesAndExpressions::RequireNumberSeparators] diff --git a/t/minimum-version.t b/t/minimum-version.t new file mode 100644 index 0000000..10a5563 --- /dev/null +++ b/t/minimum-version.t @@ -0,0 +1,32 @@ +#!/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 . + +use strict; +use warnings; + +use Test::More; +use Test::Dpkg qw(:needs); + +test_needs_author(); +test_needs_module('Test::MinimumVersion'); +test_needs_srcdir_switch(); + +my @files = Test::Dpkg::all_perl_files(); + +plan tests => scalar @files; + +for my $file (@files) { + minimum_version_ok($file, '5.20.2'); +} diff --git a/t/module-version.t b/t/module-version.t new file mode 100644 index 0000000..401f373 --- /dev/null +++ b/t/module-version.t @@ -0,0 +1,73 @@ +#!/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 . + +use strict; +use warnings; + +use Test::More; +use Test::Dpkg qw(:needs); +use Module::Metadata; + +test_needs_srcdir_switch(); + +my @files = Test::Dpkg::all_perl_modules(); + +plan tests => scalar @files; + +sub module_version_ok +{ + my $file = shift; + + my $mod = Module::Metadata->new_from_file($file, collect_pod => 1); + my $modver = $mod->version(); + my $podver; + + SKIP: { + if ($mod->contains_pod()) { + my $in_changes = 0; + + foreach my $sect ($mod->pod_inside) { + if ($sect eq 'CHANGES') { + $in_changes = 1; + next; + } + + if ($in_changes and $sect =~ m/^Version ([0-9x.]+)/) { + $podver = $1; + last; + } + } + + if (not $in_changes) { + fail("module $file does not contain a CHANGES POD section"); + return; + } + } else { + skip("module $file does not contain POD", 1); + } + + if (defined $podver and $podver eq '0.xx') { + ok($modver =~ m/^0.\d\d$/, + "module $file version $modver is POD version 0.xx"); + } else { + ok($modver eq $podver, + "module $file version $modver == POD version $podver"); + } + } +} + +foreach my $file (@files) { + module_version_ok($file); +}; diff --git a/t/po.t b/t/po.t new file mode 100644 index 0000000..ce48395 --- /dev/null +++ b/t/po.t @@ -0,0 +1,51 @@ +#!/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 . + +use strict; +use warnings; + +use Test::More; +use Test::Dpkg qw(:needs); + +test_needs_author(); +test_needs_command('i18nspector'); +test_needs_srcdir_switch(); + +my @files = Test::Dpkg::all_po_files(); + +plan skip_all => 'no PO files distributed' if @files == 0; +plan tests => scalar @files; + +sub po_ok { + my $file = shift; + + my $tags = qx(i18nspector \"$file\" 2>&1); + + # Fixup the output: + $tags =~ s/^.*\.pot: boilerplate-in-initial-comments .*\n//mg; + $tags =~ s/^.*\.po: duplicate-header-field X-POFile-SpellExtra\n//mg; + chomp $tags; + + my $ok = length $tags == 0; + + ok($ok, "PO check $file"); + if (not $ok) { + diag($tags); + } +} + +for my $file (@files) { + po_ok($file); +} diff --git a/t/pod-coverage.t b/t/pod-coverage.t new file mode 100644 index 0000000..113feb2 --- /dev/null +++ b/t/pod-coverage.t @@ -0,0 +1,77 @@ +#!/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 . + +use strict; +use warnings; + +use List::Util qw(any); +use File::Find; +use Module::Metadata; + +use Test::More; +use Test::Dpkg qw(:needs); + +test_needs_author(); +test_needs_module('Test::Pod::Coverage'); +test_needs_srcdir_switch(); + +sub all_pod_modules +{ + my @modules_todo = @_; + my @modules; + my $scan_perl_modules = sub { + my $module = $File::Find::name; + + # Only check modules, scripts are documented in man pages. + return unless $module =~ s/\.pm$//; + + my $mod = Module::Metadata->new_from_file($File::Find::name); + + # As a first step just check public modules (version > 0.xx). + return if $mod->version() =~ m/^0\.\d\d$/; + + $module =~ s{^\Q$File::Find::topdir\E/}{}; + $module =~ s{/}{::}g; + + return if any { $module eq $_ } @modules_todo; + + push @modules, $module; + }; + + my %options = ( + wanted => $scan_perl_modules, + no_chdir => 1, + ); + find(\%options, Test::Dpkg::test_get_perl_dirs()); + + return @modules; +} + +my @modules_todo = qw(Dpkg::Arch Dpkg::Source::Package); +my @modules = all_pod_modules(@modules_todo); + +plan tests => scalar @modules + scalar @modules_todo; + +for my $module (@modules) { + pod_coverage_ok($module); +} + +TODO: { + local $TODO = 'modules partially documented'; + + for my $module (@modules_todo) { + pod_coverage_ok($module); + } +} diff --git a/t/pod-spell.t b/t/pod-spell.t new file mode 100644 index 0000000..111d592 --- /dev/null +++ b/t/pod-spell.t @@ -0,0 +1,94 @@ +#!/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 . + +use strict; +use warnings; + +use Test::More; +use Test::Dpkg qw(:needs); + +test_needs_author(); +test_needs_module('Test::Spelling'); +test_needs_command('aspell'); + +if (qx(aspell dicts) !~ m/en_US/) { + plan skip_all => 'aspell en_US dictionary required for spell checking POD'; +} + +test_needs_srcdir_switch(); + +my @files = Test::Dpkg::all_perl_files(); + +plan tests => scalar @files; + +set_spell_cmd('aspell list --encoding UTF-8 -l en_US -p /dev/null'); +add_stopwords(); + +for my $file (@files) { + pod_file_spelling_ok($file); +} + +__DATA__ +CVS +DSC +Dpkg +IPC +ORed +OpenPGP +RCS +XDG +archqual +buildinfo +bzip2 +canonicalized +checksum +checksums +cmdline +debian +decompressor +dep +deps +dpkg +dpkg-buildflags +dpkg-checkbuilddeps +dpkg-dev +dpkg-genbuildinfo +dpkg-gencontrol +dpkg-parsechangelog +dsc +dup'ed +env +envvar +fieldnames +ge +getters +gettext +hurd +keyrings +le +lzma +modelines +multiarch +nocheck +qa +quiesced +reportfile +rfc822 +sig +substvar +substvars +unparsed +update-buildflags +xz diff --git a/t/pod.t b/t/pod.t new file mode 100644 index 0000000..680550a --- /dev/null +++ b/t/pod.t @@ -0,0 +1,27 @@ +#!/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 . + +use strict; +use warnings; + +use Test::More; +use Test::Dpkg qw(:needs :paths); + +test_needs_module('Test::Pod', '1.00'); +test_needs_srcdir_switch(); + +my @files = Test::Dpkg::all_perl_files(); + +all_pod_files_ok(@files); diff --git a/t/shellcheck.t b/t/shellcheck.t new file mode 100644 index 0000000..0eb64bd --- /dev/null +++ b/t/shellcheck.t @@ -0,0 +1,70 @@ +#!/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 . + +use strict; +use warnings; + +use Test::More; +use Test::Dpkg qw(:needs); + +test_needs_author(); +test_needs_command('shellcheck'); +test_needs_srcdir_switch(); + +my @todofiles = qw( + dselect/methods/disk/install + dselect/methods/disk/setup + dselect/methods/disk/update + dselect/methods/multicd/install + dselect/methods/multicd/setup + dselect/methods/multicd/update +); +my @files = qw( + autogen + get-version + run-script + debian/dpkg.cron.daily + debian/dpkg.postinst + debian/dpkg.postrm + scripts/dpkg-maintscript-helper.sh +); +my @shellcheck_opts = ( + '--exclude=SC2039', # Allow local keyword. + '--exclude=SC2166', # Allow -a and -o. + '--exclude=SC2034', # Allow unused variables for colors. +); + +plan tests => scalar @files; + +sub shell_syntax_ok +{ + my $file = shift; + + my $tags = qx(shellcheck @shellcheck_opts $file 2>&1); + + # Fixup the output: + chomp $tags; + + my $ok = length $tags == 0; + + ok($ok, 'shellcheck'); + if (not $ok) { + diag($tags); + } +} + +foreach my $file (@files) { + shell_syntax_ok($file); +} diff --git a/t/strict.t b/t/strict.t new file mode 100644 index 0000000..62c792f --- /dev/null +++ b/t/strict.t @@ -0,0 +1,34 @@ +#!/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 . + +use strict; +use warnings; + +use Test::More; +use Test::Dpkg qw(:needs); + +test_needs_module('Test::Strict'); +test_needs_srcdir_switch(); + +eval '$Test::Strict::TEST_WARNINGS = 1'; + +my @files = Test::Dpkg::all_perl_files(); + +plan tests => scalar @files * 2; + +for my $file (@files) { + strict_ok($file); + warnings_ok($file); +} diff --git a/t/synopsis.t b/t/synopsis.t new file mode 100644 index 0000000..99835b6 --- /dev/null +++ b/t/synopsis.t @@ -0,0 +1,32 @@ +#!/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 . + +use strict; +use warnings; + +use Test::More; +use Test::Dpkg qw(:needs); + +test_needs_author(); +test_needs_module('Test::Synopsis'); +test_needs_srcdir_switch(); + +my @files = Test::Dpkg::all_perl_files(); + +plan tests => scalar @files; + +for my $file (@files) { + synopsis_ok($file); +} diff --git a/t/syntax.t b/t/syntax.t new file mode 100644 index 0000000..4dfe63d --- /dev/null +++ b/t/syntax.t @@ -0,0 +1,48 @@ +#!/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 . + +use strict; +use warnings; + +use Test::More; +use Test::Dpkg qw(:needs); + +test_needs_srcdir_switch(); + +my @files = Test::Dpkg::all_perl_files(); + +plan tests => scalar @files; + +my $PERL = $ENV{PERL} // $^X // 'perl'; + +# Detect compilation warnings that are not found with just «use warnings», +# such as redefinition of symbols from multiple imports. We cannot use +# Test::Strict::syntax_ok because it does not pass -w to perl, and does not +# check for other issues whenever perl states the syntax is ok. +sub syntax_ok { + my $file = shift; + + my $eval = `$PERL -cw \"$file\" 2>&1`; + my $ok = ($eval =~ s{^\Q$file\E syntax OK\n$}{}ms) && length $eval == 0; + + ok($ok, "Compilation check $file"); + if (not $ok) { + diag($eval); + } +} + +for my $file (@files) { + syntax_ok($file); +} -- cgit v1.2.3