summaryrefslogtreecommitdiff
path: root/contrib/cirrus/pr-removes-fixed-skips.t
blob: c936892cddda820febb150b05d01b3d90794d7cb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#!/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"