]> git.pond.sub.org Git - empserver/blob - tests/normalize.pl
tests: Document log file normalization a bit better
[empserver] / tests / normalize.pl
1 #!/usr/bin/perl
2
3 # TODO Don't hardcode xdump columns, get them from xdump meta
4
5 use warnings;
6 use strict;
7 use Getopt::Std;
8
9 $Getopt::Std::STANDARD_HELP_VERSION = 1;
10 our ($opt_j, $opt_s);
11 getopts('js')
12     or die "$0: invalid options\n";
13 die "$0: either -j or -s, not both\n"
14     if $opt_j && $opt_s;
15
16 my $ctime_re = qr/(Sun|Mon|Tue|Wed|Thu|Fri|Sat) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) [ 123][0-9] [0-2][0-9]:[0-5][0-9]:[0-6][0-9] [0-9][0-9][0-9][0-9]/;
17 my $xdfld_re = qr/\([^)]*\)|[^ (][^ ]*/;
18
19 # Current dump, if any
20 # Either zero or the name of the dump we're currently processing.
21 # Legacy dump names start with an uppercase letter, and xdump names
22 # start with a lowercase letter.
23 my $dump = "";
24
25 sub norm_ctime {
26     my ($s) = @_;
27     $s =~ s/$ctime_re/Thu Jan  1 00:00:00 1970/g;
28     return $s;
29 }
30
31 while (<>) {
32     chomp;
33
34     # Strip log timestamp
35     if ($opt_j || $opt_s) {
36         die "$0: malformed line" unless /^$ctime_re /;
37         $_ = substr($_, 25);
38     }
39
40     # Split off prefix that is not to be normalized
41     my $pfx = '';
42     if ($opt_j) {
43         die "$0: malformed line" unless substr($_, 10, 1) eq ' ';
44         $pfx .= substr($_, 0, 11);
45         # Normalize only player output
46         $_ = substr($_, 11);
47         if (/(^output [^ ]* 1 )(.*)/) {
48             $pfx .= $1;
49             $_ = $2;
50         } else {
51             $pfx .= $_;
52             $_ = '';
53         }
54     }
55
56     if ($opt_s) {
57         $_ = norm_ctime($_);
58         ### Host environment in logs
59         # getrusage() results in server.log
60         s/(End update|done assembling paths) .* user .* system/$1 0.0 user 0.0 system/g;
61         # PID in server.log
62         s/(Empire server \(pid) [0-9]+(\) started)/$1 42$2/g;
63         ### Harmless races
64         # shutdown wins race with logout
65         next if /Waiting for player threads to terminate/;
66         print "$pfx$_\n";
67         next;
68     }
69
70     $dump = ""
71         if ($dump =~ /^[a-z]/
72             and /^\//)
73         or ($dump =~ /^[A-Z]/
74             and (/\: No (sector|ship|plane|unit|nuke)\(s\)|\: Nothing lost/
75                  or /^[0-9]+ (sector|ship|plane|unit|nuke|lost item)/));
76
77     ### Formatted time
78     # nat_timeused in prompt
79     s/^\[[0-9]+(:[0-9]+\] Command \:)/[0$1/g;
80     # TODO command play column time
81     # result of ctime() in many commands
82     $_ = norm_ctime($_)
83         unless $dump;
84     ### Time values in legacy dumps
85     s/(DUMP (SECTOR|SHIPS|PLANES|LAND UNITS|NUKES|LOST ITEMS)) [0-9]+$/$1 0/g;
86     s/ [0-9]+$/ 0/
87         if $dump eq 'LOST ITEMS';
88     ### Time values in xdump
89     s/(XDUMP (meta )?[-a-z0-9]+) [0-9]+$/$1 0/
90         unless $dump;
91     # HACK: assume any integer with more than 10 digits is time
92     # TODO don't do that, use xdump meta instead
93     s/(^| )[0-9]{10,}/${1}0/g
94         if $dump =~ /^[a-z]/;
95     # timeused in xdump country timeused (column 10)
96     s/^(($xdfld_re ){10})([0-9]+) /${1}255 /
97         if $dump eq 'country';
98     # timeused in xdump nat (column 15)
99     s/^(($xdfld_re ){15})([0-9]+) /${1}255 /
100         if $dump eq 'nat';
101     # duration in xdump news (column 4)
102     s/^(($xdfld_re ){4})([0-9]+) /${1}0 /
103         if $dump eq 'news';
104     ### nsc_type values in xdump
105     # Can vary between systems, because the width of enumeration types
106     # is implementation-defined.
107     # TODO type in xdump meta
108     ### nrndx values in xdump
109     # Encoding depends on the host, see resources[].  Too clever by half;
110     # perhaps we should change it.
111     # nrndx in xdump product (column 12)
112     s/^(($xdfld_re ){12})([0-9]+) /${1}0 /
113         if $dump eq 'product';
114     # value in xdump resources (column 0)
115     s/^[0-9]+ /0 /
116         if $dump eq 'resources';
117     ### Floating-point zero in xdump
118     # Windows %#g prints it with seven significant digits instead of six
119     s/ 0\.000000/ 0.00000/g
120         if $dump =~ /^[a-z]/;
121
122     print "$pfx$_\n";
123
124     if (/(XDUMP|^config) (meta )?([-a-z0-9]+)/) {
125         $dump = $3;
126         die unless $dump =~ /^[a-z]/;
127     } elsif (/DUMP (SECTOR|SHIPS|PLANES|LAND UNITS|NUKES|LOST ITEMS) /) {
128         $dump = $1;
129     }
130 }