diff options
author | Greg Sabino Mullane | 2009-04-07 17:55:36 +0000 |
---|---|---|
committer | Greg Sabino Mullane | 2009-04-07 17:55:36 +0000 |
commit | 968294774e675aab54a7988b43d4517a23f9005d (patch) | |
tree | 48830f45c5239b5734690ec074163b20581554f2 | |
parent | c4542e56d59f8d1fef88faa9e0a71d4a77406614 (diff) |
Put in a common testing schema.
Allow fake functions as well.
Add wal_files test, clean up others with some refactoring.
-rw-r--r-- | t/00_basic.t | 2 | ||||
-rw-r--r-- | t/02_backends.t | 97 | ||||
-rw-r--r-- | t/02_checkpoint.t | 31 | ||||
-rw-r--r-- | t/02_locks.t | 35 | ||||
-rw-r--r-- | t/02_replicate_row.t | 21 | ||||
-rw-r--r-- | t/02_version.t | 3 | ||||
-rw-r--r-- | t/02_walfiles.t | 54 | ||||
-rw-r--r-- | t/CP_Testing.pm | 69 |
8 files changed, 206 insertions, 106 deletions
diff --git a/t/00_basic.t b/t/00_basic.t index 45d6aaa03..dd58b71e0 100644 --- a/t/00_basic.t +++ b/t/00_basic.t @@ -1,6 +1,6 @@ #!perl -## Simply test that the script compiles and gives a good version +## Simply test that the script compiles and gives a valid version use strict; use warnings; diff --git a/t/02_backends.t b/t/02_backends.t index f443d4d1d..23d9a4a82 100644 --- a/t/02_backends.t +++ b/t/02_backends.t @@ -6,14 +6,13 @@ use strict; use warnings; use Data::Dumper; use DBI; -use Cwd; use Test::More tests => 52; use lib 't','.'; use CP_Testing; use vars qw/$dbh $dbh2 $SQL $count $host $t $result/; -my $cp = CP_Testing->new(); +my $cp = CP_Testing->new( {default_action => 'backends'} ); $dbh = $cp->test_database_handle(); @@ -27,7 +26,7 @@ is ($count, 1, $t); $host = $cp->get_host(); -$result = $cp->run('backends'); +$result = $cp->run(); my $S = q{Action 'backends'}; @@ -47,110 +46,110 @@ $t=qq{$S returned correct performance data}; like ($result, qr{ \| time=(\d\.\d\d) ardala=0 beedeebeedee=0 postgres=2 template0=0 template1=0\s$}, $t); $t=qq{$S fails when called with an invalid option}; -like ($cp->run('backends', 'foobar=12'), qr{^\s*Usage:}, $t); +like ($cp->run('foobar=12'), qr{^\s*Usage:}, $t); $t=qq{$S fails when called with an invalid warning option}; -like ($cp->run('backends', '-w felz'), qr{^ERROR: Warning}, $t); -like ($cp->run('backends', '-w " 12345"'), qr{^ERROR: Warning}, $t); -like ($cp->run('backends', '-w 23%%'), qr{^ERROR: Warning}, $t); +like ($cp->run('-w felz'), qr{^ERROR: Warning}, $t); +like ($cp->run('-w " 12345"'), qr{^ERROR: Warning}, $t); +like ($cp->run('-w 23%%'), qr{^ERROR: Warning}, $t); $t=qq{$S fails when called with an invalid critical option}; -like ($cp->run('backends', '-c felz'), qr{^ERROR: Critical}, $t); -like ($cp->run('backends', '-c " 12345"'), qr{^ERROR: Critical}, $t); -like ($cp->run('backends', '-c 23%%'), qr{^ERROR: Critical}, $t); +like ($cp->run('-c felz'), qr{^ERROR: Critical}, $t); +like ($cp->run('-c " 12345"'), qr{^ERROR: Critical}, $t); +like ($cp->run('-c 23%%'), qr{^ERROR: Critical}, $t); $t=qq{$S fails when the warning option is greater than the critical option}; -like ($cp->run('backends', '-w 20 -c 10'), qr{^ERROR: The 'warning'.+greater}, $t); -like ($cp->run('backends', '-w 20% -c 10%'), qr{^ERROR: The 'warning'.+greater}, $t); +like ($cp->run('-w 20 -c 10'), qr{^ERROR: The 'warning'.+greater}, $t); +like ($cp->run('-w 20% -c 10%'), qr{^ERROR: The 'warning'.+greater}, $t); $t=qq{$S fails when the warning option is less than the critical option}; -like ($cp->run('backends', '-w -10 -c -20'), qr{^ERROR: The 'warning'.+less}, $t); +like ($cp->run('-w -10 -c -20'), qr{^ERROR: The 'warning'.+less}, $t); $t=qq{$S fails when the warning option is a negative percent}; -like ($cp->run('backends', '-w -10%'), qr{^ERROR: Cannot specify a negative percent}, $t); +like ($cp->run('-w -10%'), qr{^ERROR: Cannot specify a negative percent}, $t); $t=qq{$S fails when the critical option is a negative percent}; -like ($cp->run('backends', '-c -10%'), qr{^ERROR: Cannot specify a negative percent}, $t); +like ($cp->run('-c -10%'), qr{^ERROR: Cannot specify a negative percent}, $t); $t=qq{$S with the 'noidle' option returns expected result}; -like ($cp->run('backends', '-noidle'), qr{^POSTGRES_BACKENDS OK:.+ 2 of 10 connections}, $t); +like ($cp->run('-noidle'), qr{^POSTGRES_BACKENDS OK:.+ 2 of 10 connections}, $t); $dbh2 = $cp->get_fresh_dbh(); $dbh2->do('SELECT 123'); -like ($cp->run('backends', '-noidle'), qr{^POSTGRES_BACKENDS OK:.+ 3 of 10 connections}, $t); +like ($cp->run('-noidle'), qr{^POSTGRES_BACKENDS OK:.+ 3 of 10 connections}, $t); $dbh2->commit(); -like ($cp->run('backends', '-noidle'), qr{^POSTGRES_BACKENDS OK:.+ 2 of 10 connections}, $t); +like ($cp->run('-noidle'), qr{^POSTGRES_BACKENDS OK:.+ 2 of 10 connections}, $t); $t=qq{$S has critical option trump the warning option}; -like ($cp->run('backends', '-w 1 -c 1'), qr{^POSTGRES_BACKENDS CRITICAL}, $t); -like ($cp->run('backends', '--critical=1 --warning=0'), qr{^POSTGRES_BACKENDS CRITICAL}, $t); +like ($cp->run('-w 1 -c 1'), qr{^POSTGRES_BACKENDS CRITICAL}, $t); +like ($cp->run('--critical=1 --warning=0'), qr{^POSTGRES_BACKENDS CRITICAL}, $t); $t=qq{$S works with warning option as an absolute number}; -like ($cp->run('backends', '-w 2'), qr{^POSTGRES_BACKENDS WARNING}, $t); -like ($cp->run('backends', '-w 3'), qr{^POSTGRES_BACKENDS WARNING}, $t); -like ($cp->run('backends', '-w 4'), qr{^POSTGRES_BACKENDS OK}, $t); +like ($cp->run('-w 2'), qr{^POSTGRES_BACKENDS WARNING}, $t); +like ($cp->run('-w 3'), qr{^POSTGRES_BACKENDS WARNING}, $t); +like ($cp->run('-w 4'), qr{^POSTGRES_BACKENDS OK}, $t); $t=qq{$S works with warning option as an percentage}; -like ($cp->run('backends', '-w 20%'), qr{^POSTGRES_BACKENDS WARNING}, $t); -like ($cp->run('backends', '-w 30%'), qr{^POSTGRES_BACKENDS WARNING}, $t); -like ($cp->run('backends', '-w 40%'), qr{^POSTGRES_BACKENDS OK}, $t); +like ($cp->run('-w 20%'), qr{^POSTGRES_BACKENDS WARNING}, $t); +like ($cp->run('-w 30%'), qr{^POSTGRES_BACKENDS WARNING}, $t); +like ($cp->run('-w 40%'), qr{^POSTGRES_BACKENDS OK}, $t); $t=qq{$S works with warning option as a negative number}; -like ($cp->run('backends', '-w -6'), qr{^POSTGRES_BACKENDS WARNING}, $t); -like ($cp->run('backends', '-w -7'), qr{^POSTGRES_BACKENDS WARNING}, $t); -like ($cp->run('backends', '-w -8'), qr{^POSTGRES_BACKENDS OK}, $t); +like ($cp->run('-w -6'), qr{^POSTGRES_BACKENDS WARNING}, $t); +like ($cp->run('-w -7'), qr{^POSTGRES_BACKENDS WARNING}, $t); +like ($cp->run('-w -8'), qr{^POSTGRES_BACKENDS OK}, $t); $t=qq{$S works with critical option as an absolute number}; -like ($cp->run('backends', '-c 2'), qr{^POSTGRES_BACKENDS CRITICAL}, $t); -like ($cp->run('backends', '-c 3'), qr{^POSTGRES_BACKENDS CRITICAL}, $t); -like ($cp->run('backends', '-c 4'), qr{^POSTGRES_BACKENDS OK}, $t); +like ($cp->run('-c 2'), qr{^POSTGRES_BACKENDS CRITICAL}, $t); +like ($cp->run('-c 3'), qr{^POSTGRES_BACKENDS CRITICAL}, $t); +like ($cp->run('-c 4'), qr{^POSTGRES_BACKENDS OK}, $t); $t=qq{$S works with critical option as an percentage}; -like ($cp->run('backends', '-c 20%'), qr{^POSTGRES_BACKENDS CRITICAL}, $t); -like ($cp->run('backends', '-c 30%'), qr{^POSTGRES_BACKENDS CRITICAL}, $t); -like ($cp->run('backends', '-c 40%'), qr{^POSTGRES_BACKENDS OK}, $t); +like ($cp->run('-c 20%'), qr{^POSTGRES_BACKENDS CRITICAL}, $t); +like ($cp->run('-c 30%'), qr{^POSTGRES_BACKENDS CRITICAL}, $t); +like ($cp->run('-c 40%'), qr{^POSTGRES_BACKENDS OK}, $t); $t=qq{$S works with critical option as a negative number}; -like ($cp->run('backends', '-c -6'), qr{^POSTGRES_BACKENDS CRITICAL}, $t); -like ($cp->run('backends', '-c -7'), qr{^POSTGRES_BACKENDS CRITICAL}, $t); -like ($cp->run('backends', '-c -8'), qr{^POSTGRES_BACKENDS OK}, $t); +like ($cp->run('-c -6'), qr{^POSTGRES_BACKENDS CRITICAL}, $t); +like ($cp->run('-c -7'), qr{^POSTGRES_BACKENDS CRITICAL}, $t); +like ($cp->run('-c -8'), qr{^POSTGRES_BACKENDS OK}, $t); $t=qq{$S works when no items caught by pg_stat_activity}; ## This is tricky to test properly. $cp->create_fake_pg_table('pg_stat_activity'); -like ($cp->run('backends'), qr{^POSTGRES_BACKENDS OK: .+No connections}, $t); +like ($cp->run(), qr{^POSTGRES_BACKENDS OK: .+No connections}, $t); $t=qq{$S returns correct MRTG output when no rows}; -is ($cp->run('backends', '--output=MRTG'), qq{0\n0\n\nDB=postgres Max connections=10\n}, $t); +is ($cp->run('--output=MRTG'), qq{0\n0\n\nDB=postgres Max connections=10\n}, $t); $cp->remove_fake_pg_table('pg_stat_activity'); $t=qq{$S fails as expected when max_connections cannot be determined}; $cp->create_fake_pg_table('pg_settings'); -like ($cp->run('backends'), qr{^POSTGRES_BACKENDS UNKNOWN: .+max_connections}, $t); +like ($cp->run(), qr{^POSTGRES_BACKENDS UNKNOWN: .+max_connections}, $t); $cp->remove_fake_pg_table('pg_settings'); $t=qq{$S returns correct MRTG output when rows found}; -is ($cp->run('backends', '--output=MRTG'), qq{3\n0\n\nDB=postgres Max connections=10\n}, $t); +is ($cp->run('--output=MRTG'), qq{3\n0\n\nDB=postgres Max connections=10\n}, $t); $t=qq{$S works when include forces no matches}; -like ($cp->run('backends', '--include=foobar'), qr{POSTGRES_BACKENDS OK: .+No connections}, $t); +like ($cp->run('--include=foobar'), qr{POSTGRES_BACKENDS OK: .+No connections}, $t); $t=qq{$S works when include has valid database}; -like ($cp->run('backends', '--include=postgres'), qr{POSTGRES_BACKENDS OK: .+3 of 10}, $t); +like ($cp->run('--include=postgres'), qr{POSTGRES_BACKENDS OK: .+3 of 10}, $t); $t=qq{$S works when exclude forces no matches}; -like ($cp->run('backends', '--exclude=postgres'), qr{POSTGRES_BACKENDS OK: .+No connections}, $t); +like ($cp->run('--exclude=postgres'), qr{POSTGRES_BACKENDS OK: .+No connections}, $t); $t=qq{$S works when exclude excludes nothing}; -like ($cp->run('backends', '--exclude=foobar'), qr{POSTGRES_BACKENDS OK: .+3 of 10}, $t); +like ($cp->run('--exclude=foobar'), qr{POSTGRES_BACKENDS OK: .+3 of 10}, $t); $t=qq{$S works when include and exclude make a match}; -like ($cp->run('backends', '--exclude=postgres --include=postgres'), qr{POSTGRES_BACKENDS OK: .+3 of 10}, $t); +like ($cp->run('--exclude=postgres --include=postgres'), qr{POSTGRES_BACKENDS OK: .+3 of 10}, $t); $t=qq{$S works when include and exclude make a match}; -like ($cp->run('backends', '--include=postgres --exclude=postgres'), qr{POSTGRES_BACKENDS OK: .+3 of 10}, $t); +like ($cp->run('--include=postgres --exclude=postgres'), qr{POSTGRES_BACKENDS OK: .+3 of 10}, $t); $t=qq{$S returned correct performance data with include}; -like ($cp->run('backends', '--include=postgres'), qr{ \| time=(\d\.\d\d) ardala=0 beedeebeedee=0 postgres=3}, $t); +like ($cp->run('--include=postgres'), qr{ \| time=(\d\.\d\d) ardala=0 beedeebeedee=0 postgres=3}, $t); exit; diff --git a/t/02_checkpoint.t b/t/02_checkpoint.t index b40fd5663..9f77213d0 100644 --- a/t/02_checkpoint.t +++ b/t/02_checkpoint.t @@ -6,64 +6,63 @@ use strict; use warnings; use Data::Dumper; use DBI; -use Cwd; use Test::More tests => 13; use lib 't','.'; use CP_Testing; -use vars qw/$dbh $dbh2 $SQL $count $host $t $result $info/; +use vars qw/$dbh $SQL $t/; -my $cp = CP_Testing->new(); +my $cp = CP_Testing->new( {default_action => 'checkpoint'} ); $dbh = $cp->test_database_handle(); my $S = q{Action 'checkpoint'}; $t=qq{$S fails when called with an invalid option}; -like ($cp->run('checkpoint', 'foobar=12'), qr{^\s*Usage:}, $t); +like ($cp->run('foobar=12'), qr{^\s*Usage:}, $t); $t=qq{$S fails when called without warning or critical}; -like ($cp->run('checkpoint', ''), qr{Must provide a warning and/or critical}, $t); +like ($cp->run(''), qr{Must provide a warning and/or critical}, $t); $t=qq{$S fails when called with invalid warning option}; -like ($cp->run('checkpoint', '-w foo'), qr{ERROR: .+'warning'.+valid time}, $t); +like ($cp->run('-w foo'), qr{ERROR: .+'warning'.+valid time}, $t); $t=qq{$S fails when called with invalid critical option}; -like ($cp->run('checkpoint', '-c foo'), qr{ERROR: .+'critical'.+valid time}, $t); +like ($cp->run('-c foo'), qr{ERROR: .+'critical'.+valid time}, $t); $t=qq{$S fails when called without a datadir option and PGDATA is not set}; delete $ENV{PGDATA}; -like ($cp->run('checkpoint', '-c 10'), qr{ERROR: Must supply a --datadir}, $t); +like ($cp->run('-c 10'), qr{ERROR: Must supply a --datadir}, $t); $t=qq{$S fails when called with an invalid datadir option and PGDATA is not set}; -like ($cp->run('checkpoint', '-c 10 --datadir=foobar'), qr{ERROR: Invalid data_directory}, $t); +like ($cp->run('-c 10 --datadir=foobar'), qr{ERROR: Invalid data_directory}, $t); my $host = $cp->get_host(); $t=qq{$S fails when called against a non datadir datadir}; -like ($cp->run('checkpoint', "-c 10 --datadir=$host"), qr{ERROR: Call to pg_controldata}, $t); +like ($cp->run("-c 10 --datadir=$host"), qr{ERROR: Call to pg_controldata}, $t); $t=qq{$S works when called for a recent checkpoint}; my $dbh = $cp->get_dbh(); $dbh->do('CHECKPOINT'); $dbh->commit(); $host =~ s/socket$//; -like ($cp->run('checkpoint', "-w 20 --datadir=$host"), qr{POSTGRES_CHECKPOINT OK}, $t); +like ($cp->run("-w 20 --datadir=$host"), qr{POSTGRES_CHECKPOINT OK}, $t); $t=qq{$S returns a warning when checkpoint older than warning option}; diag "Sleeping for a bit to age the checkpoint time...\n"; sleep 2; -like ($cp->run('checkpoint', "-w 1 --datadir=$host"), qr{WARNING:}, $t); +like ($cp->run("-w 1 --datadir=$host"), qr{WARNING:}, $t); $t=qq{$S returns a critical when checkpoint older than critical option}; -like ($cp->run('checkpoint', "-c 1 --datadir=$host"), qr{CRITICAL:}, $t); +like ($cp->run("-c 1 --datadir=$host"), qr{CRITICAL:}, $t); $t=qq{$S returns the correct number of seconds}; -like ($cp->run('checkpoint', "-c 1 --datadir=$host"), qr{was \d seconds ago}, $t); +like ($cp->run("-c 1 --datadir=$host"), qr{was \d seconds ago}, $t); $t=qq{$S returns the expected output for MRTG}; -like ($cp->run('checkpoint', "-c 1 --output=MRTG --datadir=$host"), qr{^\d\n0\n\nLast checkpoint was \d seconds ago}, $t); +like ($cp->run("-c 1 --output=MRTG --datadir=$host"), qr{^\d\n0\n\nLast checkpoint was \d seconds ago}, $t); $t=qq{$S returns the expected output for MRTG}; -like ($cp->run('checkpoint', "-c 199 --output=MRTG --datadir=$host"), qr{^\d\n0\n\nLast checkpoint was \d seconds ago}, $t); +like ($cp->run("-c 199 --output=MRTG --datadir=$host"), qr{^\d\n0\n\nLast checkpoint was \d seconds ago}, $t); exit; diff --git a/t/02_locks.t b/t/02_locks.t index 594fd1f4c..2f231c5f2 100644 --- a/t/02_locks.t +++ b/t/02_locks.t @@ -6,70 +6,69 @@ use strict; use warnings; use Data::Dumper; use DBI; -use Cwd; use Test::More tests => 14; use lib 't','.'; use CP_Testing; -use vars qw/$dbh $dbh2 $SQL $count $host $t $result $info/; +use vars qw/$dbh $SQL $t/; -my $cp = CP_Testing->new(); +my $cp = CP_Testing->new( {default_action => 'locks' } ); $dbh = $cp->test_database_handle(); my $S = q{Action 'locks'}; $t=qq{$S fails when called with an invalid option}; -like ($cp->run('locks', 'foobar=12'), qr{^\s*Usage:}, $t); +like ($cp->run('foobar=12'), qr{^\s*Usage:}, $t); $t=qq{$S fails when invalid database used}; -like ($cp->run('locks', '--dbname=foo'), qr{database "foo" does not exist}, $t); +like ($cp->run('--dbname=foo'), qr{database "foo" does not exist}, $t); $t=qq{$S fails when no matching databases found}; -like ($cp->run('locks', '--include=foo'), qr{No matching databases found}, $t); +like ($cp->run('--include=foo'), qr{No matching databases found}, $t); $cp->create_fake_pg_table('pg_locks'); $SQL = q{SELECT oid FROM pg_database WHERE datname = 'postgres'}; my $dboid = $dbh->selectall_arrayref($SQL)->[0][0]; -$SQL = 'INSERT INTO public.pg_locks(database,mode,granted) VALUES (?,?,?)'; +$SQL = 'INSERT INTO cptest.pg_locks(database,mode,granted) VALUES (?,?,?)'; my $fakelock_sth = $dbh->prepare($SQL); $fakelock_sth->execute($dboid,'Exclusive','t'); $dbh->commit(); $t=qq{$S returns correct OK message}; -like ($cp->run('locks', '--critical=100'), qr{POSTGRES_LOCKS OK.*total=1 }, $t); +like ($cp->run('--critical=100'), qr{POSTGRES_LOCKS OK.*total=1 }, $t); $t=qq{$S returns correct warning message}; -like ($cp->run('locks', '--warning=1'), qr{POSTGRES_LOCKS WARNING.*total locks: 1 }, $t); +like ($cp->run('--warning=1'), qr{POSTGRES_LOCKS WARNING.*total locks: 1 }, $t); $t=qq{$S returns correct critical message}; -like ($cp->run('locks', '--critical=1'), qr{POSTGRES_LOCKS CRITICAL.*total locks: 1 }, $t); +like ($cp->run('--critical=1'), qr{POSTGRES_LOCKS CRITICAL.*total locks: 1 }, $t); $t=qq{$S returns correct OK message for specific lock type check}; -like ($cp->run('locks', '--critical="total=10;exclusive=3"'), qr{POSTGRES_LOCKS OK.*total=1 }, $t); +like ($cp->run('--critical="total=10;exclusive=3"'), qr{POSTGRES_LOCKS OK.*total=1 }, $t); $t=qq{$S returns correct OK message for specific lock type check}; -like ($cp->run('locks', '--critical="total=10;foobar=3"'), qr{POSTGRES_LOCKS OK.*total=1 }, $t); +like ($cp->run('--critical="total=10;foobar=3"'), qr{POSTGRES_LOCKS OK.*total=1 }, $t); $t=qq{$S returns correct warning message for specific lock type check}; -like ($cp->run('locks', '--warning="total=10;exclusive=1"'), qr{POSTGRES_LOCKS WARNING.*total "exclusive" locks: 1 }, $t); +like ($cp->run('--warning="total=10;exclusive=1"'), qr{POSTGRES_LOCKS WARNING.*total "exclusive" locks: 1 }, $t); $t=qq{$S returns correct critical message for specific lock type check}; -like ($cp->run('locks', '--critical="total=10;exclusive=1"'), qr{POSTGRES_LOCKS CRITICAL.*total "exclusive" locks: 1 }, $t); +like ($cp->run('--critical="total=10;exclusive=1"'), qr{POSTGRES_LOCKS CRITICAL.*total "exclusive" locks: 1 }, $t); $t=qq{$S returns correct MRTG output}; -is ($cp->run('locks', '--output=MRTG'), qq{1\n0\n\nDB: postgres\n}, $t); +is ($cp->run('--output=MRTG'), qq{1\n0\n\nDB: postgres\n}, $t); $t=qq{$S returns correct OK message for 'waiting' option}; -like ($cp->run('locks', '--warning="waiting=1"'), qr{POSTGRES_LOCKS OK.*total=1 }, $t); +like ($cp->run('--warning="waiting=1"'), qr{POSTGRES_LOCKS OK.*total=1 }, $t); $t=qq{$S returns correct warning message for 'waiting' option}; $fakelock_sth->execute($dboid,'Exclusive','f'); $dbh->commit(); -like ($cp->run('locks', '--warning="waiting=1"'), qr{POSTGRES_LOCKS WARNING.*total "waiting" locks: 1 }, $t); +like ($cp->run('--warning="waiting=1"'), qr{POSTGRES_LOCKS WARNING.*total "waiting" locks: 1 }, $t); $t=qq{$S returns correct multiple item output}; -like ($cp->run('locks', '--warning="waiting=1;exclusive=2"'), +like ($cp->run('--warning="waiting=1;exclusive=2"'), qr{POSTGRES_LOCKS WARNING.*total "waiting" locks: 1 \* total "exclusive" locks: 2 }, $t); $cp->remove_fake_pg_table('pg_locks'); diff --git a/t/02_replicate_row.t b/t/02_replicate_row.t index 3c3ac7b73..0879579e6 100644 --- a/t/02_replicate_row.t +++ b/t/02_replicate_row.t @@ -6,14 +6,13 @@ use strict; use warnings; use Data::Dumper; use DBI; -use Cwd; use Test::More tests => 19; use lib 't','.'; use CP_Testing; -use vars qw/$dbh $dbh2 $SQL $count $host $t $result $info/; +use vars qw/$dbh $dbh2 $SQL $t $result/; -my $cp = CP_Testing->new(); +my $cp = CP_Testing->new( {default_action => 'replicate-row'} ); $dbh = $cp->test_database_handle(); $dbh2 = $cp->get_fresh_dbh({dbname=>'ardala'}); @@ -35,29 +34,29 @@ $dbh2->commit(); my $S = q{Action 'replicate_rows'}; $t=qq{$S fails when called with an invalid option}; -like ($cp->run('replicate-row', 'foobar=12'), qr{^\s*Usage:}, $t); +like ($cp->run('foobar=12'), qr{^\s*Usage:}, $t); $t=qq{$S fails when called without warning or critical}; -like ($cp->run('replicate-row', ''), qr{Must provide a warning and/or critical}, $t); +like ($cp->run(''), qr{Must provide a warning and/or critical}, $t); $t=qq{$S fails when called with invalid warning}; -like ($cp->run('replicate-row', '-w foo'), qr{ERROR:.+'warning' must be a valid time}, $t); +like ($cp->run('-w foo'), qr{ERROR:.+'warning' must be a valid time}, $t); $t=qq{$S fails when called with invalid critical}; -like ($cp->run('replicate-row', '-c foo'), qr{ERROR:.+'critical' must be a valid time}, $t); +like ($cp->run('-c foo'), qr{ERROR:.+'critical' must be a valid time}, $t); $t=qq{$S fails when critical is greater than warning time}; -like ($cp->run('replicate-row', '-w 22 -c 44'), qr{ERROR:.+'warning' option cannot be less}, $t); +like ($cp->run('-w 22 -c 44'), qr{ERROR:.+'warning' option cannot be less}, $t); $t=qq{$S fails when called with no repinfo argument}; -like ($cp->run('replicate-row', '-w 2'), qr{ERROR: Need a repinfo}, $t); +like ($cp->run('-w 2'), qr{ERROR: Need a repinfo}, $t); $t=qq{$S fails when called with bad repinfo argument}; -like ($cp->run('replicate-row', '-w 2 -repinfo=abc'), qr{ERROR: Invalid repinfo}, $t); +like ($cp->run('-w 2 -repinfo=abc'), qr{ERROR: Invalid repinfo}, $t); # table, pk, id, col, val1, val2 $t=qq{$S fails when supplied values are equal}; -like ($cp->run('replicate-row', '-w 2 -repinfo=reptest,id,2,foo,yin,yin'), qr{ERROR: .+same values}, $t); +like ($cp->run('-w 2 -repinfo=reptest,id,2,foo,yin,yin'), qr{ERROR: .+same values}, $t); $t=qq{$S fails when no matching source row is found}; like ($cp->run('DB2replicate-row', '-w 2 -repinfo=reptest,id,4,foo,yin,yang'), qr{ERROR: .+not the right ones}, $t); diff --git a/t/02_version.t b/t/02_version.t index e5f2e1089..6a0b4a188 100644 --- a/t/02_version.t +++ b/t/02_version.t @@ -6,12 +6,11 @@ use strict; use warnings; use Data::Dumper; use DBI; -use Cwd; use Test::More tests => 28; use lib 't','.'; use CP_Testing; -use vars qw/$dbh $dbh2 $SQL $count $host $t $result $info/; +use vars qw/$dbh $SQL $t/; my $cp = CP_Testing->new(); diff --git a/t/02_walfiles.t b/t/02_walfiles.t new file mode 100644 index 000000000..520466687 --- /dev/null +++ b/t/02_walfiles.t @@ -0,0 +1,54 @@ +#!perl + +## Test the "wal_files" action + +use strict; +use warnings; +use Data::Dumper; +use DBI; +use Test::More tests => 11; +use lib 't','.'; +use CP_Testing; + +use vars qw/$dbh $t/; + +my $cp = CP_Testing->new({default_action => 'wal_files'}); + +$dbh = $cp->test_database_handle(); + +my $S = q{Action 'wal_files'}; + +$t=qq{$S fails when called with an invalid option}; +like ($cp->run('foobar=12'), qr{^\s*Usage:}, $t); + +$t=qq{$S fails when called with an invalid option}; +like ($cp->run('--warning=30%'), qr{ERROR:.+must be an integer}, $t); +like ($cp->run('--warning=-30'), qr{ERROR:.+must be an integer}, $t); + +$t=qq{$S works as expected for warnings}; +like ($cp->run('--warning=30'), qr{POSTGRES_WAL_FILES OK}, $t); +like ($cp->run('--warning=0'), qr{POSTGRES_WAL_FILES WARNING}, $t); + +$t=qq{$S works as expected for criticals}; +like ($cp->run('--critical=30'), qr{POSTGRES_WAL_FILES OK}, $t); +like ($cp->run('--critical=0'), qr{POSTGRES_WAL_FILES CRITICAL}, $t); + +$cp->create_fake_pg_table('pg_ls_dir', 'text'); + +like ($cp->run('--critical=1'), qr{POSTGRES_WAL_FILES OK}, $t); + +$dbh->do("INSERT INTO cptest.pg_ls_dir SELECT 'ABCDEF123456ABCDEF123456' FROM generate_series(1,99)"); +$dbh->commit(); + +$t=qq{$S returns correct number of files}; +like ($cp->run('--critical=1'), qr{POSTGRES_WAL_FILES CRITICAL.+ 99 \|}, $t); + +$t=qq{$S returns correct MRTG information}; +is ($cp->run('--critical=1 --output=mrtg'), "99\n0\n\n\n", $t); + +$t=qq{$S returns correct MRTG information}; +is ($cp->run('--critical=101 --output=mrtg'), "99\n0\n\n\n", $t); + +$cp->remove_fake_pg_table('pg_ls_dir()'); + +exit; diff --git a/t/CP_Testing.pm b/t/CP_Testing.pm index af1fa2f62..d59a02bee 100644 --- a/t/CP_Testing.pm +++ b/t/CP_Testing.pm @@ -12,13 +12,19 @@ my $DEBUG = 0; use vars qw/$com $info $count/; +my $fakeschema = 'cptest'; + sub new { my $class = shift; + my $arg = shift || {}; my $self = { started => time(), dbdir => 'test_database_check_postgres', testuser => 'check_postgres_testing', }; + if (exists $arg->{default_action}) { + $self->{action} = $arg->{default_action}; + } return bless $self => $class; } @@ -143,6 +149,12 @@ sub test_database_handle { $self->{dsn} = $dsn; $self->{superdsn} = \@superdsn; + if (! exists $self->{keep_old_schema}) { + local $dbh->{Warn}; + $dbh->do("DROP SCHEMA IF EXISTS $fakeschema CASCADE"); + } + + ## Sanity check $dbh->do("ALTER USER $dbuser SET search_path = public"); $dbh->do("SET search_path = public"); @@ -156,8 +168,9 @@ sub test_database_handle { sub run { my $self = shift; - my $action = shift or die "First arg must be the command\n"; - my $extra = shift || ''; + my @arg = @_; + my $extra = pop @arg || ''; + my $action = @arg ? $arg[0] : $self->{action} || die "First arg must be the command\n"; my $double = $action =~ s/DB2// ? 1 : 0; @@ -219,14 +232,32 @@ sub create_fake_pg_table { my $self = shift; my $name = shift || die; + my $args = shift || ''; my $dbh = $self->{dbh} || die; my $dbuser = $self->{testuser} || die; - { + if ($self->schema_exists($dbh,$fakeschema)) { local $dbh->{Warn}; - $dbh->do("DROP TABLE IF EXISTS public.$name"); + $dbh->do("DROP TABLE IF EXISTS $fakeschema.$name"); } - $dbh->do("CREATE TABLE public.$name AS SELECT * FROM $name LIMIT 0"); - $dbh->do("ALTER USER $dbuser SET search_path = public, pg_catalog"); + else { + $dbh->do("CREATE SCHEMA $fakeschema"); + } + + my $funcargs = ''; + if ($args) { + ($funcargs = $args) =~ s/\w+/NULL/g; + $funcargs = qq{($funcargs)}; + } + + $dbh->do("CREATE TABLE $fakeschema.$name AS SELECT * FROM $name$funcargs LIMIT 0"); + + if ($args) { + local $dbh->{Warn}; + $dbh->do("DROP FUNCTION IF EXISTS $fakeschema.$name($args)"); + $dbh->do("CREATE FUNCTION $fakeschema.$name($args) RETURNS SETOF TEXT LANGUAGE SQL AS 'SELECT * FROM $fakeschema.$name; '"); + } + + $dbh->do("ALTER USER $dbuser SET search_path = $fakeschema, public, pg_catalog"); $dbh->commit(); } ## end of create_fake_pg_table @@ -236,17 +267,19 @@ sub remove_fake_pg_table { my $self = shift; my $name = shift || die; + (my $name2 = $name) =~ s/\(.+//; my $dbh = $self->{dbh} || die; my $dbuser = $self->{testuser} || die; { local $dbh->{Warn}; - $dbh->do("DROP TABLE IF EXISTS public.$name"); + $dbh->do("DROP TABLE IF EXISTS public.$name2"); } $dbh->do("ALTER USER $dbuser SET search_path = public"); $dbh->commit(); } ## end of remove_fake_pg_table + sub table_exists { my ($self,$dbh,$table) = @_; @@ -259,6 +292,20 @@ sub table_exists { } ## end of table_exists + +sub schema_exists { + + my ($self,$dbh,$schema) = @_; + + my $SQL = 'SELECT count(1) FROM pg_namespace WHERE nspname = ?'; + my $sth = $dbh->prepare($SQL); + $sth->execute($schema); + my $count = $sth->fetchall_arrayref()->[0][0]; + return $count; + +} ## end of schema_exists + + sub fake_version { my $self = shift; @@ -266,15 +313,19 @@ sub fake_version { my $dbh = $self->{dbh} || die; my $dbuser = $self->{testuser} || die; + if (! $self->schema_exists($dbh, $fakeschema)) { + $dbh->do("CREATE SCHEMA $fakeschema"); + } + $dbh->do(qq{ -CREATE OR REPLACE FUNCTION public.version() +CREATE OR REPLACE FUNCTION $fakeschema.version() RETURNS TEXT LANGUAGE SQL AS \$\$ SELECT 'PostgreSQL $version on fakefunction for check_postgres.pl testing'::text; \$\$ }); - $dbh->do("ALTER USER $dbuser SET search_path = public, pg_catalog"); + $dbh->do("ALTER USER $dbuser SET search_path = $fakeschema, public, pg_catalog"); $dbh->commit(); } ## end of fake version |