# Check PgCommon library functions. use strict; use File::Temp qw/tempdir/; use lib '.'; use PgCommon; use lib 't'; use TestLib; use Test::More tests => 24; my $tdir = tempdir (CLEANUP => 1); $PgCommon::confroot = $tdir; # test read_pg_hba with valid file open P, ">$tdir/pg_hba.conf" or die "Could not create $tdir/pg_hba.conf: $!"; print P < 'local', 'db' => 'all', 'user' => 'postgres', 'method' => 'ident sameuser' }, { 'type' => 'local', 'db' => 'foo', 'user' => 'nobody', 'method' => 'trust' }, { 'type' => 'local', 'db' => 'foo', 'user' => 'nobody', 'method' => 'crypt' }, { 'type' => 'local', 'db' => 'foo', 'user' => 'nobody,joe', 'method' => 'krb5' }, { 'type' => 'local', 'db' => 'foo,bar', 'user' => 'nobody', 'method' => 'ident' }, { 'type' => 'local', 'db' => 'all', 'user' => '+foogrp', 'method' => 'password' }, { 'type' => 'host', 'db' => '@inc', 'user' => 'all', 'method' => 'md5', 'ip' => '127.0.0.1', 'mask' => '32'}, { 'type' => 'hostssl', 'db' => 'all', 'user' => '@inc', 'method' => 'pam', 'ip' => '192.168.0.0', 'mask' => '255.255.0.0'}, { 'type' => 'hostnossl', 'db' => 'all', 'user' => 'all', 'method' => 'reject', 'ip' => '192.168.0.0', 'mask' => '255.255.0.0'}, ); my @hba = read_pg_hba "$tdir/pg_hba.conf"; foreach my $entry (@hba) { next if $$entry{'type'} eq 'comment'; if ($#expected_records < 0) { fail '@expected_records is already empty'; next; } my $expected = shift @expected_records; my $parsedstr = ''; my $expectedstr = ''; foreach my $k (keys %$expected) { $parsedstr .= $k . ':\'' . $$entry{$k} . '\' '; $expectedstr .= $k . ':\'' . $$expected{$k} . '\' '; if ($$expected{$k} ne $$entry{$k}) { fail "mismatch: $expectedstr ne $parsedstr"; last; } } pass 'correctly parsed line \'' . $$entry{'line'} . "'"; } ok (($#expected_records == -1), '@expected_records has correct number of entries'); # test read_pg_hba with invalid file my $invalid_hba = <$tdir/pg_hba.conf" or die "Could not create $tdir/pg_hba_invalid.conf: $!"; print P $invalid_hba; close P; @hba = read_pg_hba "$tdir/pg_hba.conf"; is (scalar (split "\n", $invalid_hba), $#hba+1, 'returned read_pg_hba array has correct number of records'); foreach my $entry (@hba) { is $$entry{'type'}, undef, 'line \'' . $$entry{'line'} . '\' parsed as invalid'; } # test read_conf_file() my %conf = PgCommon::read_conf_file '/nonexisting'; is_deeply \%conf, {}, 'read_conf_file returns empty dict for nonexisting file'; mkdir "$tdir/8.4"; mkdir "$tdir/8.4/test" or die "mkdir: $!"; mkdir "$tdir/conf.d" or die "mkdir: $!"; my $c = "$tdir/8.4/test/foo.conf"; open F, ">$c" or die "Could not create $c: $!"; print F < 42, 'cintval' => 1, 'floatval' => '1.5e+3', 'strval' => 'hello', 'strval2' => 'world', 'cstrval' => 'bye', 'testpath' => '/bin/test', 'emptystr' => '', 'cemptystr' => '', 'quotestr' => "test ! -f '/tmp/%f' && echo 'yes'" }, 'read_conf_file() parsing'); # test read_conf_file() with include directives open F, ">$tdir/8.4/test/condinc.conf" or die "Could not create $tdir/condinc.conf: $!"; print F "condint = 42\n"; close F; open F, ">$tdir/bar.conf" or die "Could not create $tdir/bar.conf: $!"; print F <$tdir/conf.d/sub.conf" or die "Could not create $tdir/conf.d/sub.conf: $!"; print F <$tdir/relative.conf" or die "Could not create $tdir/relative.conf: $!"; print F <$tdir/absolute.conf" or die "Could not create $tdir/absolute.conf: $!"; print F < 42, 'cintval' => 1, 'floatval' => '1.5e+3', 'strval' => 'howdy', 'strval2' => 'world', 'cstrval' => 'bye', 'testpath' => '/bin/test', 'emptystr' => '', 'cemptystr' => '', 'quotestr' => "test ! -f '/tmp/%f' && echo 'yes'", 'condint' => 42, 'subvalue' => 1, 'relativevalue' => 1, 'absolutevalue' => 1, }, 'read_conf_file() parsing with include directives'); # test set_conf_value() PgCommon::set_conf_value '8.4', 'test', 'foo.conf', 'commented_int', '24'; PgCommon::set_conf_value '8.4', 'test', 'foo.conf', 'commented_str', 'new foo'; PgCommon::set_conf_value '8.4', 'test', 'foo.conf', 'commented_bool', 'on'; PgCommon::set_conf_value '8.4', 'test', 'foo.conf', 'commented_bool2', 'on'; PgCommon::set_conf_value '8.4', 'test', 'foo.conf', 'commented_bool3', 'on'; PgCommon::set_conf_value '8.4', 'test', 'foo.conf', 'intval', '39'; PgCommon::set_conf_value '8.4', 'test', 'foo.conf', 'cintval', '5'; PgCommon::set_conf_value '8.4', 'test', 'foo.conf', 'strval', 'Howdy'; PgCommon::set_conf_value '8.4', 'test', 'foo.conf', 'newval', 'NEW!'; PgCommon::set_conf_value '8.4', 'test', 'foo.conf', 'testpath', '/bin/new'; PgCommon::set_conf_value '8.4', 'test', 'foo.conf', 'include_dir', 'conf.d'; open F, "$c"; my $conf; read F, $conf, 1024; close F; is ($conf, <