Files
podman/contrib/cirrus/pr-removes-fixed-skips.t
Ed Santiago 6764fe03d0 CI: new check for leftover skips/fixmes
If a PR says "Fixes #123", make sure it removes skips and/or
FIXME comments that reference issue 123.

Signed-off-by: Ed Santiago <santiago@redhat.com>
2022-07-28 09:00:31 -06:00

135 lines
3.8 KiB
Perl
Executable File

#!/usr/bin/perl -w
# Don't care if these modules don't exist in CI; only Ed runs this test
use v5.14;
use Test::More;
use Test::Differences;
use File::Basename;
use File::Path qw(make_path remove_tree);
use File::Temp qw(tempdir);
use FindBin;
# Simpleminded parser tests. LHS gets glommed together into one long
# github message; RHS (when present) is the expected subset of issue IDs
# that will be parsed from it.
#
# Again, we glom the LHS into one long multiline string. There doesn't
# seem to be much point to testing line-by-line.
my $parser_tests = <<'END_PARSER_TESTS';
Fixes 100
Fixes: 101
Closes 102
Fixes: #103 | 103
Fix: #104, #105 | 104
Resolves: #106 closes #107 | 106 107
fix: #108, FIXES: #109, FiXeD: #110 | 108 109 110
Close: #111 resolved: #112 | 111 112
END_PARSER_TESTS
# Read tests from __END__ section of this script
my @full_tests;
while (my $line = <DATA>) {
chomp $line;
if ($line =~ /^==\s+(.*)/) {
push @full_tests,
{ name => $1, issues => [], files => {}, expect => [] };
}
elsif ($line =~ /^\[([\d\s,]+)\]$/) {
$full_tests[-1]{issues} = [ split /,\s+/, $1 ];
}
# 1 1 23 3 4 4 5 52
elsif ($line =~ m!^(\!|\+)\s+((\S+):(\d+):(.*))$!) {
push @{$full_tests[-1]{expect}}, $2 if $1 eq '+';
$full_tests[-1]{files}{$3}[$4] = $5;
}
}
plan tests => 1 + 1 + @full_tests;
require_ok "$FindBin::Bin/pr-removes-fixed-skips";
#
# Parser tests. Just run as one test.
#
my $msg = '';
my @parser_expect;
for my $line (split "\n", $parser_tests) {
if ($line =~ s/\s+\|\s+([\d\s]+)$//) {
push @parser_expect, split ' ', $1;
}
$msg .= $line . "\n";
}
my @parsed = Podman::CI::PrRemovesFixedSkips::fixed_issues($msg);
eq_or_diff \@parsed, \@parser_expect, "parser parses issue IDs";
###############################################################################
#
# Full tests. Create dummy source-code trees and verify that our check runs.
#
my $tmpdir = tempdir(basename($0) . ".XXXXXXXX", TMPDIR => 1, CLEANUP => 1);
chdir $tmpdir
or die "Cannot cd $tmpdir: $!";
mkdir $_ for qw(cmd libpod pkg test);
for my $t (@full_tests) {
for my $f (sort keys %{$t->{files}}) {
my $lineno = 0;
make_path(dirname($f));
open my $fh, '>', $f or die;
my @lines = @{$t->{files}{$f}};
for my $i (1 .. @lines + 10) {
my $line = $lines[$i] || "[line $i intentionally left blank]";
print { $fh } $line, "\n";
}
close $fh
or die;
}
# FIXME: run test
my @actual = Podman::CI::PrRemovesFixedSkips::unremoved_skips(@{$t->{issues}});
eq_or_diff \@actual, $t->{expect}, $t->{name};
# clean up
unlink $_ for sort keys %{$t->{files}};
}
chdir '/';
__END__
== basic test
[12345]
! test/foo/bar/foo.bar:10: skip "#12345: not a .go file"
+ test/foo/bar/foo.go:17: skip "#12345: this one should be found"
+ test/zzz/foo.bats:10: # FIXME: #12345: we detect FIXMEs also
== no substring matches
[123]
! test/system/123-foo.bats:12: skip "#1234: should not match 123"
! test/system/123-foo.bats:13: skip "#0123: should not match 123"
== multiple matches
[456, 789]
+ cmd/podman/foo_test.go:10: Skip("#456 - blah blah")
! cmd/podman/foo_test.go:15: Skip("#567 - not a match")
+ cmd/podman/foo_test.go:19: Skip("#789 - match 2nd issue")
+ cmd/podman/zzz_test.go:12: Skip("#789 - in another file")
== no match on bkp files
[10101]
! pkg/podman/foo_test.go~:10: Skip("#10101: no match in ~ file")
! pkg/podman/foo_test.go.bkp:10: Skip("#10101: no match in .bkp file")
== no match if Skip is commented out
[123]
! test/e2e/foo_test.go:10: // Skip("#123: commented out")
! test/system/012-foo.bats:20: # skip "#123: commented out"