summaryrefslogtreecommitdiffstats
path: root/mysql-test/include/search_pattern_in_file.inc
blob: 3105f7f90773d1baa348c4460d1b93bfb1099f15 (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
# Purpose:
#    Simple search with Perl for a pattern in some file.
#
#    The advantages compared to thinkable auxiliary constructs using the
#    mysqltest language and SQL are:
#    1. We do not need a running MySQL server.
#    2. SQL causes "noise" during debugging and increases the size of logs.
#       Perl code does not disturb at all.
#
#    The environment variables SEARCH_FILE and SEARCH_PATTERN must be set
#    before sourcing this routine.
#    SEARCH_TYPE can also be set to either NULL(default) or _gm_
#    NULL is equivalent of using m/SEARCH_PATTERN/gs
#    _gm_ is equivalent of using m/SEARCH_RANGE/gm
#
#    Optionally, SEARCH_RANGE can be set to the max number of bytes of the file
#    to search. If negative, it will search that many bytes at the end of the
#    file. By default the search happens from the last CURRENT_TEST:
#    marker till the end of file (appropriate for searching error logs).
#
#    Optionally, SEARCH_ABORT can be set to "FOUND" or "NOT FOUND" and this
#    will abort if the search result doesn't match the requested one.
#
#    Optionally, SEARCH_OUTPUT can be set to control the format of output.
#    Supported formats:
#     - (default)  : "FOUND n /pattern/ in FILE " or "NOT FOUND ..."
#     - "matches"  : Each match is printed, on a separate line
#
#    In case of
#    - SEARCH_FILE and/or SEARCH_PATTERN is not set
#    - SEARCH_FILE cannot be opened
#    the test will abort immediate.
#
# Typical use case (check invalid server startup options):
#    let $error_log= $MYSQLTEST_VARDIR/log/my_restart.err;
#    --error 0,1
#    --remove_file $error_log
#    let SEARCH_FILE= $error_log;
#    # Stop the server
#    let $restart_file= $MYSQLTEST_VARDIR/tmp/mysqld.1.expect;
#    --exec echo "wait" > $restart_file
#    --shutdown_server
#    --source include/wait_until_disconnected.inc
#
#    --error 1
#    --exec $MYSQLD_CMD <whatever wrong setting> > $error_log 2>&1
#    # The server restart aborts
#    let SEARCH_PATTERN= \[ERROR\] Aborting;
#    --source include/search_pattern_in_file.inc
#
# Created: 2011-11-11 mleich
#

--error 0,1
perl;
    use strict;
    die "SEARCH_FILE not set" unless $ENV{SEARCH_FILE};
    my @search_files= glob($ENV{SEARCH_FILE});
    my $search_pattern= $ENV{SEARCH_PATTERN} or die "SEARCH_PATTERN not set";
    my $search_range=   $ENV{SEARCH_RANGE};
    my $silent=         $ENV{SEARCH_SILENT};
    my $search_result= 0;
    my $content;
    foreach my $search_file (@search_files) {
        open(FILE, '<', $search_file) || die("Can't open file $search_file: $!");
        my $file_content;
        if ($search_range > 0) {
           read(FILE, $file_content, $search_range, 0);
        } elsif ($search_range < 0) {
           my $size= -s $search_file;
           $search_range = -$size if $size > -$search_range;
           seek(FILE, $search_range, 2);
           read(FILE, $file_content, -$search_range, 0);
        } else {
          while(<FILE>) { # error log
            if (/^CURRENT_TEST:/) {
              $content='';
            } else {
              $content.=$_;
            }
          }
        }
        close(FILE);
        $content.= $file_content;
    }
    my @matches;
    if (not defined($ENV{SEARCH_TYPE}))
    {
      @matches=($content =~ /$search_pattern/gs);
    }
    elsif($ENV{SEARCH_TYPE} == "_gm_")
    {
      @matches=($content =~ /$search_pattern/gm);
    }
    my $res;
    if (@matches)
    {
        $res="FOUND " . scalar(@matches);
        $search_result= 1;
    }
    else
    {
        $res= "NOT FOUND";
    }
    $ENV{SEARCH_FILE} =~ s{^.*?([^/\\]+)$}{$1};

    if (!$silent || $search_result)
    {
        if ($ENV{SEARCH_OUTPUT} eq "matches")
        {
            foreach (@matches)
            {
                print $_ . "\n";
            }
        }
        else
        {
            print "$res /$search_pattern/ in $ENV{SEARCH_FILE}\n";
        }
    }
    die "$ENV{SEARCH_ABORT}\n"
      if $ENV{SEARCH_ABORT} && $res =~ /^$ENV{SEARCH_ABORT}/;
   exit($search_result != 1);
EOF

let $SEARCH_RESULT= 1;          # Found pattern
if ($errno)
{
    let $SEARCH_RESULT= 0;      # Did not find pattern
}