[check_postgres] [commit] Many translation fixes and the cool test file that helped me find them.
check_postgres at bucardo.org
check_postgres at bucardo.org
Tue Apr 28 02:01:14 UTC 2009
Committed by Greg Sabino Mullane <greg at endpoint.com>
Many translation fixes and the cool test file that helped me find them.
---
check_postgres.pl | 31 +++++----
t/03_translations.t | 188 +++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 204 insertions(+), 15 deletions(-)
diff --git a/check_postgres.pl b/check_postgres.pl
index 737fe4b..abb4d46 100755
--- a/check_postgres.pl
+++ b/check_postgres.pl
@@ -91,13 +91,14 @@ our %msg = (
'backends-users' => q{$1 for number of users must be a number or percentage},
'bloat-index' => q{index $1 rows:$2 pages:$3 shouldbe:$4 ($5X) wasted bytes:$6 ($7)},
'bloat-nomin' => q{no relations meet the minimum bloat criteria},
- 'bloat-table' => q{table $1.$2 rows:$3 pages:$3 shouldbe:$4 ($5X) wasted size:$6 ($7)},
+ 'bloat-table' => q{table $1.$2 rows:$3 pages:$4 shouldbe:$5 ($6X) wasted size:$7 ($8)},
'checkpoint-baddir' => q{Invalid data_directory: "$1"},
'checkpoint-baddir2' => q{pg_controldata could not read the given data directory: "$1"},
'checkpoint-badver' => q{Failed to run pg_controldata - probably the wrong version},
'checkpoint-badver2' => q{Failed to run pg_controldata - is it the correct version?},
'checkpoint-nodir' => q{Must supply a --datadir argument or set the PGDATA environment variable},
'checkpoint-nodp' => q{Must install the Perl module Date::Parse to use the checkpoint action},
+ 'checkpoint-noparse' => q{Unable to parse pg_controldata output: "$1"},
'checkpoint-noregex' => q{Call to pg_controldata $1 failed},
'checkpoint-nosys' => q{Could not call pg_controldata: $1},
'checkpoint-ok' => q{Last checkpoint was 1 second ago},
@@ -107,7 +108,6 @@ our %msg = (
'checksum-msg' => q{checksum: $1},
'checksum-nomd' => q{Must install the Perl module Digest::MD5 to use the checksum action},
'checksum-nomrtg' => q{Must provide a checksum via the --mrtg option},
- 'checksum-noparse' => q{Unable to parse pg_controldata output: "$1"},
'custom-invalid' => q{Invalid format returned by custom query},
'custom-norows' => q{No rows returned},
'custom-nostring' => q{Must provide a query string},
@@ -117,7 +117,7 @@ our %msg = (
'die-badversion' => q{Invalid version string: $1},
'die-noset' => q{Cannot run "$1" $2 is not set to on},
'die-nosetting' => q{Could not fetch setting '$1'},
- 'diskspace-df' => q{Could not find required executable /bin/df},
+ 'diskspace-nodf' => q{Could not find required executable /bin/df},
'diskspace-fail' => q{Invalid result from command "$1": $2},
'diskspace-msg' => q{FS $1 mounted on $2 is using $3 of $4 ($5%)},
'diskspace-nodata' => q{Could not determine data_directory: are you connecting as a superuser?},
@@ -146,8 +146,8 @@ our %msg = (
'logfile-syslog' => q{Database is using syslog, please specify path with --logfile option (fac=$1)},
'maxtime' => q{ maxtime=$1}, ## needs leading space
'mrtg-fail' => q{Action $1 failed: $2},
+ 'new-cp-fail' => q{Unable to determine the current version of check_postgres.pl},
'new-cp-ok' => q{Version $1 is the latest for check_postgres.pl},
- 'new-cp-unknown' => q{Unable to determine the latest version of check_postgres.pl},
'new-cp-warn' => q{Version $1 of check_postgres.pl exists (this is version $2)},
'new-pg-badver' => q{Could not determine the Postgres revision (version was $1)},
'new-pg-badver2' => q{Could not find revision information for Postgres version $1},
@@ -280,13 +280,14 @@ our %msg = (
'backends-users' => q{$1 pour le nombre d'utilisateurs doit être un nombre ou un pourcentage},
'bloat-index' => q{index $1 lignes:$2 pages:$3 devrait être:$4 ($5X) octets perdus:$6 ($7)},
'bloat-nomin' => q{aucune relation n'atteint le critère minimum de fragmentation},
- 'bloat-table' => q{table $1.$2 lignes:$3 pages:$3 devrait être:$4 ($5X) place perdue:$6 ($7)},
+ 'bloat-table' => q{table $1.$2 lignes:$3 pages:$4 devrait être:$5 ($6X) place perdue:$7 ($8)},
'checkpoint-baddir' => q{data_directory invalide : "$1"},
'checkpoint-baddir2' => q{pg_controldata could not read the given data directory: "$1"},
'checkpoint-badver' => q{Failed to run pg_controldata - probably the wrong version},
'checkpoint-badver2' => q{Failed to run pg_controldata - is it the correct version?},
'checkpoint-nodir' => q{Vous devez fournir un argument --datadir ou configurer la variable d'environnement PGDATA},
'checkpoint-nodp' => q{Vous devez installer le module Perl Date::Parse pour utiliser l'action checkpoint},
+ 'checkpoint-noparse' => q{Incapable d'analyser le résultat de la commande pg_controldata : "$1"},
'checkpoint-noregex' => q{Ãchec de l'appel à pg_controldata $1},
'checkpoint-nosys' => q{N'a pas pu appeler pg_controldata : $1},
'checkpoint-ok' => q{Le dernier CHECKPOINT est survenu il y a une seconde},
@@ -296,7 +297,6 @@ our %msg = (
'checksum-msg' => q{somme de contrôle : $1},
'checksum-nomd' => q{Vous devez installer le module Perl Digest::MD5 pour utiliser l'action checksum},
'checksum-nomrtg' => q{Vous devez fournir une somme de contrôle avec l'option --mrtg},
- 'checksum-noparse' => q{Incapable d'analyser le résultat de la commande pg_controldata : "$1"},
'custom-invalid' => q{Format invalide renvoyé par la requête personnalisée},
'custom-norows' => q{Aucune ligne renvoyée},
'custom-nostring' => q{Vous devez fournir une requête},
@@ -306,7 +306,7 @@ our %msg = (
'die-badversion' => q{Version invalide : $1},
'die-noset' => q{Ne peut pas exécuter « $1 » $2 n'est pas activé},
'die-nosetting' => q{N'a pas pu récupérer le paramètre « $1 »},
- 'diskspace-df' => q{N'a pas pu trouver l'exécutable /bin/df},
+ 'diskspace-nodf' => q{N'a pas pu trouver l'exécutable /bin/df},
'diskspace-fail' => q{Résultat invalide pour la commande « $1 » : $2},
'diskspace-msg' => q{Le système de fichiers $1 monté sur $2 utilise $3 sur $4 ($5%)},
'diskspace-nodata' => q{N'a pas pu déterminer data_directory : êtes-vous connecté en tant que super-utilisateur ?},
@@ -318,7 +318,7 @@ our %msg = (
'fsm-rel-highver' => q{Cannot check on fsm_relations on servers version 8.4 or greater},
'invalid-option' => q{Option invalide},
'invalid-query' => q{Une requête invalide a renvoyé : $1},
- 'listener-count' => q{ listening=$1}, ## needs leading space
+'listener-count' => q{ listening=$1}, ## needs leading space
'listener-msg' => q{processus LISTEN trouvés : $1},
'locks-msg' => q{total des verrous « $1 » : $2},
'locks-msg2' => q{total des verrous : $1},
@@ -335,8 +335,8 @@ our %msg = (
'logfile-syslog' => q{La base de données utiliser syslog, merci de spécifier le chemin avec l'option --logfile (fac=$1)},
'maxtime' => q{ maxtime=$1}, ## needs leading space
'mrtg-fail' => q{Ãchec de l'action $1 : $2},
+'new-cp-fail' => q{Unable to determine the current version of check_postgres.pl},
'new-cp-ok' => q{La version $1 est la dernière pour check_postgres.pl},
- 'new-cp-unknown' => q{Impossible de déterminer la dernière version de check_postgres.pl},
'new-cp-warn' => q{La version $1 de check_postgres.pl existe (ceci est la version $2)},
'new-pg-badver' => q{N'a pas pu déterminer la révision de Postgres (la version était $1)},
'new-pg-badver2' => q{N'a pas pu trouver l'information de révision de Posrgres version $1},
@@ -371,6 +371,7 @@ our %msg = (
'range-int' => q{Argument invalide pour l'option « $1 » : doit être un entier},
'range-int-pos' => q{Argument invalide pour l'option « $1 » : doit être un entier positif},
'range-neg-percent' => q{Ne peut pas indiquer un pourcentage négatif !},
+'range-none' => q{No warning or critical options are needed},
'range-noopt-both' => q{Doit fournir les options warning et critical},
'range-noopt-one' => q{Doit fournir une option warning ou critical},
'range-noopt-only' => q{Peut seulement fournir une option warning ou critical},
@@ -435,7 +436,7 @@ our %msg = (
'time-minute' => q{minute},
'time-minutes' => q{minutes},
'time-month' => q{mois},
- 'time-monthss' => q{mois},
+ 'time-months' => q{mois},
'time-second' => q{seconde},
'time-seconds' => q{secondes},
'time-week' => q{semaine},
@@ -445,7 +446,7 @@ our %msg = (
'timesync-diff' => q{ diff=$1}, ## needs leading space
'timesync-msg' => q{timediff=$1 Base de données=$2 Local=$3},
'trigger-msg' => q{Triggers désactivés : $1},
- 'txnidle-msg' => q{longest idle in txn: $1s},
+'txnidle-msg' => q{longest idle in txn: $1s},
'txnidle-none' => q{Aucun processus en attente dans une transaction},
'txntime-fail' => q{Ãchec de la requête},
'txntime-msg' => q{Transaction la plus longue : $1s},
@@ -1238,7 +1239,7 @@ sub build_symlinks {
## Create symlinks to most actions
$ME =~ /postgres/
- or die msgn('symlinks-name');
+ or die msgn('symlink-name');
my $force = $action =~ /force/ ? 1 : 0;
for my $action (sort keys %$action_info) {
@@ -3866,7 +3867,7 @@ sub check_timesync {
$stats{$db->{dbname}} = $diff;
next;
}
- $db->{perf} = msg('diff', $diff);
+ $db->{perf} = msg('timesync-diff', $diff);
my $localpretty = sprintf '%d-%02d-%02d %02d:%02d:%02d', $l[5]+1900, $l[4]+1, $l[3],$l[2],$l[1],$l[0];
my $msg = msg('timesync-msg', $diff, $pgpretty, $localpretty);
@@ -4370,7 +4371,7 @@ sub check_checkpoint {
## If the path is echoed back, we most likely have an invalid data dir
if ($res =~ /$dir/) {
- ndie msg('checkpoint-baddir2');
+ ndie msg('checkpoint-baddir2', $dir);
}
if ($res =~ /WARNING: Calculated CRC checksum/) {
@@ -4590,7 +4591,7 @@ sub check_prepared_txns {
my $info = run_command($SQL, {regex => qr[\w+], emptyok => 1 } );
- my $msg = msg('prepared-txn-none');
+ my $msg = msg('preptxn-none');
my $found = 0;
for $db (@{$info->{db}}) {
my (@crit, at warn, at ok);
diff --git a/t/03_translations.t b/t/03_translations.t
new file mode 100644
index 0000000..53bbe6c
--- /dev/null
+++ b/t/03_translations.t
@@ -0,0 +1,188 @@
+#!perl
+
+## Run some sanity checks on the translations
+
+use strict;
+use warnings;
+use Data::Dumper;
+BEGIN {
+ use vars qw/$t %complete_langs/;
+ %complete_langs = (
+ 'en' => 'English',
+ 'fr' => 'French',
+ );
+}
+use Test::More tests => 3 + (5 * ((scalar keys %complete_langs)-1));
+
+my $file = 'check_postgres.pl';
+my ($fh, $slurp);
+if (!open $fh, '<', $file) {
+ if (!open $fh, '<', "../$file") {
+ die "Could not find $file!\n";
+ }
+}
+{
+ local $/;
+ $slurp = <$fh>;
+}
+close $fh or warn qq{Could not close "$file": $!\n};
+
+my ($lang,%msg,%call);
+my ($start,$linecount) = (0,0);
+for my $line (split /\n/ => $slurp) {
+ $linecount++;
+ if (!$start) {
+ if ($line =~ /^our \%msg/) {
+ $start = 1;
+ }
+ next;
+ }
+
+ while ($line =~ /msgn?\('([\w\-]+)'(.*?)\)/g) {
+ my ($msg,$args,$orig) = ($1,$2,$2);
+ $args =~ s/substr\(.+?,.+?,/substr\(foo bar/g;
+ my $numargs = $args =~ y/,//d;
+ push @{$call{$msg}}, { line => $linecount, numargs => $numargs, actual => $orig };
+ }
+
+ if ($line =~ /^'(\w+)' => \{/) {
+ $lang = $1;
+ $msg{$lang} = {};
+ next;
+ }
+
+ if ($line =~ /^(\s*)'([\w\-]+)'\s+=> qq?\{(.+?)}[,.]/) {
+ my ($space,$msg,$value) = (length $1 ? 1 : 0, $2, $3);
+ $msg{$lang}{$msg} = [$space,$value];
+ next;
+ }
+}
+
+$t=qq{All msg() function calls are mapped to an 'en' string};
+my $ok = 1;
+for my $call (sort keys %call) {
+ if (!exists $msg{'en'}{$call}) {
+ my $lines = join ',' => map { $_->{line} } @{$call{$call}};
+ fail qq{Could not find message for "$call" (lines: $lines)};
+ $ok = 0;
+ }
+}
+$ok and pass $t;
+
+$t=qq{All msg() function calls are called with correct number of arguments};
+$ok = 1;
+for my $call (sort keys %call) {
+ next if !exists $msg{'en'}{$call};
+ my $msg = $msg{'en'}{$call}->[1];
+ for my $l (@{$call{$call}}) {
+ my $line = $l->{line};
+ my $numargs = $l->{numargs};
+ for my $x (1..$numargs) {
+ if ($msg !~ /\$$x/) {
+ fail sprintf qq{Message '%s' called with %d %s as line %d, but no %s argument found in msg '%s'},
+ $call, $numargs, 1==$numargs ? 'argument' : 'arguments', $line, '$'.$x, $msg;
+ $ok = 0;
+ }
+ }
+
+ if (!$numargs and $msg =~ /\$\d/) {
+ fail qq{Message '$call' called with no args at line $line, but requires some};
+ $ok = 0;
+ }
+ }
+}
+$ok and pass $t;
+
+my %ok2notuse = map { $_, 1 }
+ qw/time-week time-weeks time-month time-months time-year time-years/;
+
+my %ok2nottrans;
+for my $msg (qw/timesync-diff time-minute time-minutes maxtime version version-ok/) {
+ $ok2nottrans{'fr'}{$msg} = 1;
+}
+
+$t=qq{All 'en' message strings are used somewhere in the code};
+$ok = 1;
+for my $msg (sort keys %{$msg{'en'}}) {
+ if (!exists $call{$msg}) {
+ ## Known exceptions
+ next if exists $ok2notuse{$msg};
+ fail qq{Message '$msg' does not appear to be used in the code};
+ $ok = 0;
+ }
+}
+$ok and pass $t;
+
+for my $l (sort keys %complete_langs) {
+ my $lang = $complete_langs{$l};
+ next if $lang eq 'English';
+
+ $ok = 1;
+ $t=qq{Language $lang contains all valid message strings};
+ for my $msg (sort keys %{$msg{'en'}}) {
+ if (! exists $msg{$l}{$msg}) {
+ fail qq{Message '$msg' does not appear in the $lang translations};
+ $ok = 0;
+ }
+ }
+ $ok and pass $t;
+
+ $ok = 1;
+ $t=qq{Language $lang contains no extra message strings};
+ for my $msg (sort keys %{$msg{$l}}) {
+ if (! exists $msg{'en'}{$msg}) {
+ fail qq{Message '$msg' does not appear in the 'en' messages!};
+ $ok = 0;
+ }
+ }
+ $ok and pass $t;
+
+ $ok = 1;
+ $t=qq{Language $lang messages have same number of args as 'en'};
+ for my $msg (sort keys %{$msg{'en'}}) {
+ next if ! exists $msg{$l}{$msg};
+ my $val = $msg{'en'}{$msg}->[1];
+ my $lval = $msg{$l}{$msg}->[1];
+ my $x = 1;
+ {
+ last if $val !~ /\$$x/;
+ if ($lval !~ /\$$x/) {
+ fail qq{Message '$msg' is missing \$$x argument for language $lang};
+ $ok = 0;
+ }
+ $x++;
+ redo;
+ }
+ }
+ $ok and pass $t;
+
+ $ok = 1;
+ $t=qq{Language $lang messages appears to not be translated, but is not marked as such};
+ for my $msg (sort keys %{$msg{'en'}}) {
+ next if ! exists $msg{$l}{$msg};
+ next if exists $ok2nottrans{$l}{$msg};
+ my $val = $msg{'en'}{$msg}->[1];
+ my $lval = $msg{$l}{$msg}->[1];
+ my $indent = $msg{$l}{$msg}->[0];
+ if ($val eq $lval and $indent) {
+ fail qq{Message '$msg' in language $lang appears to not be translated, but it not marked as such};
+ $ok = 0;
+ }
+ }
+ $ok and pass $t;
+
+ $ok = 1;
+ $t=qq{Language $lang messages are marked as translated correctly};
+ for my $msg (sort keys %{$msg{'en'}}) {
+ next if ! exists $msg{$l}{$msg};
+ my $val = $msg{'en'}{$msg}->[1];
+ my $lval = $msg{$l}{$msg}->[1];
+ my $indent = $msg{$l}{$msg}->[0];
+ if ($val ne $lval and !$indent) {
+ fail qq{Message '$msg' in language $lang appears to not be translated, but it not marked as such};
+ $ok = 0;
+ }
+ }
+ $ok and pass $t;
+}
+exit;
--
1.6.0.5
More information about the Check_postgres
mailing list