Committed by Greg Sabino Mullane <[email protected]>

Subject: [DBD::Pg 2/2] Skip largeobject tests unless run as Postgres superuser

---
 t/03dbmethod.t | 440 +++++++++++++++++++++++++++++----------------------------
 1 file changed, 224 insertions(+), 216 deletions(-)

diff --git a/t/03dbmethod.t b/t/03dbmethod.t
index b6eea19..9351869 100644
--- a/t/03dbmethod.t
+++ b/t/03dbmethod.t
@@ -1550,251 +1550,259 @@ $dbh->rollback();
 
 SKIP: {
 
-       eval {
-               require File::Temp;
-       };
-       $@ and skip ('Must have File::Temp to test pg_lo_import* and 
pg_lo_export', 8);
-
-       $t='DB handle method "pg_lo_import" works';
-       my ($fh,$filename) = File::Temp::tmpnam();
-       print {$fh} "abc\ndef";
-       close $fh or warn 'Failed to close temporary file';
-       $handle = $dbh->pg_lo_import($filename);
-       my $objid = $handle;
-       ok ($handle, $t);
-
-       $t='DB handle method "pg_lo_import" inserts correct data';
-       $SQL = "SELECT data FROM pg_largeobject where loid = $handle";
-       $info = $dbh->selectall_arrayref($SQL)->[0][0];
-       is_deeply ($info, "abc\ndef", $t);
-       $dbh->commit();
+       my $super = is_super();
+
+       $super or skip ('Cannot run largeobject tests unless run as Postgres 
superuser', 38);
+
 
   SKIP: {
-               if ($pglibversion < 80400) {
-                       skip ('Cannot test pg_lo_import_with_oid unless 
compiled against 8.4 or better server', 5);
-               }
-               if ($pgversion < 80100) {
-                       skip ('Cannot test pg_lo_import_with_oid against old 
versions of Postgres', 5);
-               }
 
-               $t='DB handle method "pg_lo_import_with_oid" works with high 
number';
-               my $highnumber = 345167;
-               $dbh->pg_lo_unlink($highnumber);
+               eval {
+                       require File::Temp;
+               };
+               $@ and skip ('Must have File::Temp to test pg_lo_import* and 
pg_lo_export', 8);
+
+               $t='DB handle method "pg_lo_import" works';
+               my ($fh,$filename) = File::Temp::tmpnam();
+               print {$fh} "abc\ndef";
+               close $fh or warn 'Failed to close temporary file';
+               $handle = $dbh->pg_lo_import($filename);
+               my $objid = $handle;
+               ok ($handle, $t);
+
+               $t='DB handle method "pg_lo_import" inserts correct data';
+               $SQL = "SELECT data FROM pg_largeobject where loid = $handle";
+               $info = $dbh->selectall_arrayref($SQL)->[0][0];
+               is_deeply ($info, "abc\ndef", $t);
                $dbh->commit();
-               my $thandle;
-         SKIP: {
-
-                       skip ('Known bug: pg_log_import_with_oid throws an 
error. See RT #90448', 3);
 
-                       $thandle = $dbh->pg_lo_import_with_oid($filename, 
$highnumber);
-                       is ($thandle, $highnumber, $t);
+         SKIP: {
+                       if ($pglibversion < 80400) {
+                               skip ('Cannot test pg_lo_import_with_oid unless 
compiled against 8.4 or better server', 5);
+                       }
+                       if ($pgversion < 80100) {
+                               skip ('Cannot test pg_lo_import_with_oid 
against old versions of Postgres', 5);
+                       }
+
+                       $t='DB handle method "pg_lo_import_with_oid" works with 
high number';
+                       my $highnumber = 345167;
+                       $dbh->pg_lo_unlink($highnumber);
+                       $dbh->commit();
+                       my $thandle;
+                 SKIP: {
+
+                               skip ('Known bug: pg_log_import_with_oid throws 
an error. See RT #90448', 3);
+
+                               $thandle = 
$dbh->pg_lo_import_with_oid($filename, $highnumber);
+                               is ($thandle, $highnumber, $t);
+                               ok ($thandle, $t);
+
+                               $t='DB handle method "pg_lo_import_with_oid" 
inserts correct data';
+                               $SQL = "SELECT data FROM pg_largeobject where 
loid = $thandle";
+                               $info = $dbh->selectall_arrayref($SQL)->[0][0];
+                               is_deeply ($info, "abc\ndef", $t);
+                       }
+
+                       $t='DB handle method "pg_lo_import_with_oid" fails when 
given already used number';
+                       eval {
+                               $thandle = 
$dbh->pg_lo_import_with_oid($filename, $objid);
+                       };
+                       is ($thandle, undef, $t);
+                       $dbh->rollback();
+
+                       $t='DB handle method "pg_lo_import_with_oid" falls back 
to lo_import when number is 0';
+                       eval {
+                               $thandle = 
$dbh->pg_lo_import_with_oid($filename, 0);
+                       };
                        ok ($thandle, $t);
-
-                       $t='DB handle method "pg_lo_import_with_oid" inserts 
correct data';
-                       $SQL = "SELECT data FROM pg_largeobject where loid = 
$thandle";
-                       $info = $dbh->selectall_arrayref($SQL)->[0][0];
-                       is_deeply ($info, "abc\ndef", $t);
+                       $dbh->rollback();
                }
 
-               $t='DB handle method "pg_lo_import_with_oid" fails when given 
already used number';
-               eval {
-                       $thandle = $dbh->pg_lo_import_with_oid($filename, 
$objid);
-               };
-               is ($thandle, undef, $t);
-               $dbh->rollback();
-
-               $t='DB handle method "pg_lo_import_with_oid" falls back to 
lo_import when number is 0';
-               eval {
-                       $thandle = $dbh->pg_lo_import_with_oid($filename, 0);
-               };
-               ok ($thandle, $t);
-               $dbh->rollback();
+               unlink $filename;
+
+               $t='DB handle method "pg_lo_open" works after "pg_lo_insert"';
+               $handle = $dbh->pg_lo_open($handle, $R);
+               like ($handle, qr/^\d+$/o, $t);
+
+               $t='DB handle method "pg_lo_read" returns correct data after 
"pg_lo_import"';
+               $data = '';
+               $result = $dbh->pg_lo_read($handle, $data, 100);
+               is ($result, 7, $t);
+               is ($data, "abc\ndef", $t);
+
+               $t='DB handle method "pg_lo_export" works';
+               ($fh,$filename) = File::Temp::tmpnam();
+               $result = $dbh->pg_lo_export($objid, $filename);
+               ok (-e $filename, $t);
+               seek($fh,0,1);
+               seek($fh,0,0);
+               $result = read $fh, $data, 10;
+               is ($result, 7, $t);
+               is ($data, "abc\ndef", $t);
+               close $fh or warn 'Could not close tempfile';
+               unlink $filename;
+               $dbh->pg_lo_unlink($objid);
        }
 
-       unlink $filename;
-
-       $t='DB handle method "pg_lo_open" works after "pg_lo_insert"';
-       $handle = $dbh->pg_lo_open($handle, $R);
-       like ($handle, qr/^\d+$/o, $t);
-
-       $t='DB handle method "pg_lo_read" returns correct data after 
"pg_lo_import"';
-       $data = '';
-       $result = $dbh->pg_lo_read($handle, $data, 100);
-       is ($result, 7, $t);
-       is ($data, "abc\ndef", $t);
-
-       $t='DB handle method "pg_lo_export" works';
-       ($fh,$filename) = File::Temp::tmpnam();
-       $result = $dbh->pg_lo_export($objid, $filename);
-       ok (-e $filename, $t);
-       seek($fh,0,1);
-       seek($fh,0,0);
-       $result = read $fh, $data, 10;
-       is ($result, 7, $t);
-       is ($data, "abc\ndef", $t);
-       close $fh or warn 'Could not close tempfile';
-       unlink $filename;
-       $dbh->pg_lo_unlink($objid);
-}
-
-## Same pg_lo_* tests, but with AutoCommit on
+       ## Same pg_lo_* tests, but with AutoCommit on
 
-$dbh->{AutoCommit}=1;
-
-$t='DB handle method "pg_lo_creat" fails when AutoCommit on';
-eval {
-       $dbh->pg_lo_creat($W);
-};
-like ($@, qr{pg_lo_creat when AutoCommit is on}, $t);
-
-$t='DB handle method "pg_lo_open" fails with AutoCommit on';
-eval {
-       $dbh->pg_lo_open($object, $W);
-};
-like ($@, qr{pg_lo_open when AutoCommit is on}, $t);
-
-$t='DB handle method "pg_lo_read" fails with AutoCommit on';
-eval {
-       $dbh->pg_lo_read($object, $data, 0);
-};
-like ($@, qr{pg_lo_read when AutoCommit is on}, $t);
+       $dbh->{AutoCommit}=1;
 
-$t='DB handle method "pg_lo_lseek" fails with AutoCommit on';
-eval {
-       $dbh->pg_lo_lseek($handle, 0, 0);
-};
-like ($@, qr{pg_lo_lseek when AutoCommit is on}, $t);
+       $t='DB handle method "pg_lo_creat" fails when AutoCommit on';
+       eval {
+               $dbh->pg_lo_creat($W);
+       };
+       like ($@, qr{pg_lo_creat when AutoCommit is on}, $t);
 
-$t='DB handle method "pg_lo_write" fails with AutoCommit on';
-$buf = 'tangelo mulberry passionfruit raspberry plantain' x 500;
-eval {
-       $dbh->pg_lo_write($handle, $buf, length($buf));
-};
-like ($@, qr{pg_lo_write when AutoCommit is on}, $t);
+       $t='DB handle method "pg_lo_open" fails with AutoCommit on';
+       eval {
+               $dbh->pg_lo_open($object, $W);
+       };
+       like ($@, qr{pg_lo_open when AutoCommit is on}, $t);
 
-$t='DB handle method "pg_lo_close" fails with AutoCommit on';
-eval {
-       $dbh->pg_lo_close($handle);
-};
-like ($@, qr{pg_lo_close when AutoCommit is on}, $t);
+       $t='DB handle method "pg_lo_read" fails with AutoCommit on';
+       eval {
+               $dbh->pg_lo_read($object, $data, 0);
+       };
+       like ($@, qr{pg_lo_read when AutoCommit is on}, $t);
 
-$t='DB handle method "pg_lo_tell" fails with AutoCommit on';
-eval {
-       $dbh->pg_lo_tell($handle);
-};
-like ($@, qr{pg_lo_tell when AutoCommit is on}, $t);
+       $t='DB handle method "pg_lo_lseek" fails with AutoCommit on';
+       eval {
+               $dbh->pg_lo_lseek($handle, 0, 0);
+       };
+       like ($@, qr{pg_lo_lseek when AutoCommit is on}, $t);
 
-$t='DB handle method "pg_lo_unlink" fails with AutoCommit on';
-eval {
-       $dbh->pg_lo_unlink($object);
-};
-like ($@, qr{pg_lo_unlink when AutoCommit is on}, $t);
+       $t='DB handle method "pg_lo_write" fails with AutoCommit on';
+       $buf = 'tangelo mulberry passionfruit raspberry plantain' x 500;
+       eval {
+               $dbh->pg_lo_write($handle, $buf, length($buf));
+       };
+       like ($@, qr{pg_lo_write when AutoCommit is on}, $t);
 
+       $t='DB handle method "pg_lo_close" fails with AutoCommit on';
+       eval {
+               $dbh->pg_lo_close($handle);
+       };
+       like ($@, qr{pg_lo_close when AutoCommit is on}, $t);
 
-SKIP: {
+       $t='DB handle method "pg_lo_tell" fails with AutoCommit on';
+       eval {
+               $dbh->pg_lo_tell($handle);
+       };
+       like ($@, qr{pg_lo_tell when AutoCommit is on}, $t);
 
+       $t='DB handle method "pg_lo_unlink" fails with AutoCommit on';
        eval {
-               require File::Temp;
+               $dbh->pg_lo_unlink($object);
        };
-       $@ and skip ('Must have File::Temp to test pg_lo_import and 
pg_lo_export', 5);
-
-       $t='DB handle method "pg_lo_import" works (AutoCommit on)';
-       my ($fh,$filename) = File::Temp::tmpnam();
-       print {$fh} "abc\ndef";
-       close $fh or warn 'Failed to close temporary file';
-       $handle = $dbh->pg_lo_import($filename);
-       ok ($handle, $t);
-
-       $t='DB handle method "pg_lo_import" inserts correct data (AutoCommit 
on, begin_work not called)';
-       $SQL = 'SELECT data FROM pg_largeobject where loid = ?';
-       $sth = $dbh->prepare($SQL);
-       $sth->execute($handle);
-       $info = $sth->fetchall_arrayref()->[0][0];
-       is_deeply ($info, "abc\ndef", $t);
-
-       # cleanup last lo
-       $dbh->{AutoCommit} = 0;
-       $dbh->pg_lo_unlink($handle);
-       $dbh->{AutoCommit} = 1;
+       like ($@, qr{pg_lo_unlink when AutoCommit is on}, $t);
 
-       $t='DB handle method "pg_lo_import" works (AutoCommit on, begin_work 
called, no command)';
-       $dbh->begin_work();
-       $handle = $dbh->pg_lo_import($filename);
-       ok ($handle, $t);
-       $sth->execute($handle);
-       $info = $sth->fetchall_arrayref()->[0][0];
-       is_deeply ($info, "abc\ndef", $t);
-       $dbh->rollback();
 
-       $t='DB handle method "pg_lo_import" works (AutoCommit on, begin_work 
called, no command, rollback)';
-       $dbh->begin_work();
-       $handle = $dbh->pg_lo_import($filename);
-       ok ($handle, $t);
-       $dbh->rollback();
-       $sth->execute($handle);
-       $info = $sth->fetchall_arrayref()->[0][0];
-       is_deeply ($info, undef, $t);
+  SKIP: {
 
-       $t='DB handle method "pg_lo_import" works (AutoCommit on, begin_work 
called, second command)';
-       $dbh->begin_work();
-       $dbh->do('SELECT 123');
-       $handle = $dbh->pg_lo_import($filename);
-       ok ($handle, $t);
-       $sth->execute($handle);
-       $info = $sth->fetchall_arrayref()->[0][0];
-       is_deeply ($info, "abc\ndef", $t);
-       $dbh->rollback();
+               eval {
+                       require File::Temp;
+               };
+               $@ and skip ('Must have File::Temp to test pg_lo_import and 
pg_lo_export', 5);
+
+               $t='DB handle method "pg_lo_import" works (AutoCommit on)';
+               my ($fh,$filename) = File::Temp::tmpnam();
+               print {$fh} "abc\ndef";
+               close $fh or warn 'Failed to close temporary file';
+               $handle = $dbh->pg_lo_import($filename);
+               ok ($handle, $t);
+
+               $t='DB handle method "pg_lo_import" inserts correct data 
(AutoCommit on, begin_work not called)';
+               $SQL = 'SELECT data FROM pg_largeobject where loid = ?';
+               $sth = $dbh->prepare($SQL);
+               $sth->execute($handle);
+               $info = $sth->fetchall_arrayref()->[0][0];
+               is_deeply ($info, "abc\ndef", $t);
+
+               # cleanup last lo
+               $dbh->{AutoCommit} = 0;
+               $dbh->pg_lo_unlink($handle);
+               $dbh->{AutoCommit} = 1;
+
+               $t='DB handle method "pg_lo_import" works (AutoCommit on, 
begin_work called, no command)';
+               $dbh->begin_work();
+               $handle = $dbh->pg_lo_import($filename);
+               ok ($handle, $t);
+               $sth->execute($handle);
+               $info = $sth->fetchall_arrayref()->[0][0];
+               is_deeply ($info, "abc\ndef", $t);
+               $dbh->rollback();
 
-       $t='DB handle method "pg_lo_import" works (AutoCommit on, begin_work 
called, second command, rollback)';
-       $dbh->begin_work();
-       $dbh->do('SELECT 123');
-       $handle = $dbh->pg_lo_import($filename);
-       ok ($handle, $t);
-       $dbh->rollback();
-       $sth->execute($handle);
-       $info = $sth->fetchall_arrayref()->[0][0];
-       is_deeply ($info, undef, $t);
+               $t='DB handle method "pg_lo_import" works (AutoCommit on, 
begin_work called, no command, rollback)';
+               $dbh->begin_work();
+               $handle = $dbh->pg_lo_import($filename);
+               ok ($handle, $t);
+               $dbh->rollback();
+               $sth->execute($handle);
+               $info = $sth->fetchall_arrayref()->[0][0];
+               is_deeply ($info, undef, $t);
+
+               $t='DB handle method "pg_lo_import" works (AutoCommit on, 
begin_work called, second command)';
+               $dbh->begin_work();
+               $dbh->do('SELECT 123');
+               $handle = $dbh->pg_lo_import($filename);
+               ok ($handle, $t);
+               $sth->execute($handle);
+               $info = $sth->fetchall_arrayref()->[0][0];
+               is_deeply ($info, "abc\ndef", $t);
+               $dbh->rollback();
 
-       $t='DB handle method "pg_lo_import" works (AutoCommit not on, no 
command)';
-       $dbh->{AutoCommit} = 0;
-       $dbh->commit();
-       $handle = $dbh->pg_lo_import($filename);
-       ok ($handle, $t);
-       $sth->execute($handle);
-       $info = $sth->fetchall_arrayref()->[0][0];
-       is_deeply ($info, "abc\ndef", $t);
+               $t='DB handle method "pg_lo_import" works (AutoCommit on, 
begin_work called, second command, rollback)';
+               $dbh->begin_work();
+               $dbh->do('SELECT 123');
+               $handle = $dbh->pg_lo_import($filename);
+               ok ($handle, $t);
+               $dbh->rollback();
+               $sth->execute($handle);
+               $info = $sth->fetchall_arrayref()->[0][0];
+               is_deeply ($info, undef, $t);
 
-       $t='DB handle method "pg_lo_import" works (AutoCommit not on, second 
command)';
-       $dbh->rollback();
-       $dbh->do('SELECT 123');
-       $handle = $dbh->pg_lo_import($filename);
-       ok ($handle, $t);
-       $sth->execute($handle);
-       $info = $sth->fetchall_arrayref()->[0][0];
-       is_deeply ($info, "abc\ndef", $t);
-
-       unlink $filename;
-       $dbh->{AutoCommit} = 1;
-
-       my $objid = $handle;
-       $t='DB handle method "pg_lo_export" works (AutoCommit on)';
-       ($fh,$filename) = File::Temp::tmpnam();
-       $result = $dbh->pg_lo_export($objid, $filename);
-       ok (-e $filename, $t);
-       seek($fh,0,1);
-       seek($fh,0,0);
-       $result = read $fh, $data, 10;
-       is ($result, 7, $t);
-       is ($data, "abc\ndef", $t);
-       close $fh or warn 'Could not close tempfile';
-       unlink $filename;
-
-       # cleanup last lo
+               $t='DB handle method "pg_lo_import" works (AutoCommit not on, 
no command)';
+               $dbh->{AutoCommit} = 0;
+               $dbh->commit();
+               $handle = $dbh->pg_lo_import($filename);
+               ok ($handle, $t);
+               $sth->execute($handle);
+               $info = $sth->fetchall_arrayref()->[0][0];
+               is_deeply ($info, "abc\ndef", $t);
+
+               $t='DB handle method "pg_lo_import" works (AutoCommit not on, 
second command)';
+               $dbh->rollback();
+               $dbh->do('SELECT 123');
+               $handle = $dbh->pg_lo_import($filename);
+               ok ($handle, $t);
+               $sth->execute($handle);
+               $info = $sth->fetchall_arrayref()->[0][0];
+               is_deeply ($info, "abc\ndef", $t);
+
+               unlink $filename;
+               $dbh->{AutoCommit} = 1;
+
+               my $objid = $handle;
+               $t='DB handle method "pg_lo_export" works (AutoCommit on)';
+               ($fh,$filename) = File::Temp::tmpnam();
+               $result = $dbh->pg_lo_export($objid, $filename);
+               ok (-e $filename, $t);
+               seek($fh,0,1);
+               seek($fh,0,0);
+               $result = read $fh, $data, 10;
+               is ($result, 7, $t);
+               is ($data, "abc\ndef", $t);
+               close $fh or warn 'Could not close tempfile';
+               unlink $filename;
+
+               # cleanup last lo
+               $dbh->{AutoCommit} = 0;
+               $dbh->pg_lo_unlink($handle);
+               $dbh->{AutoCommit} = 1;
+       }
        $dbh->{AutoCommit} = 0;
-       $dbh->pg_lo_unlink($handle);
-       $dbh->{AutoCommit} = 1;
 }
-$dbh->{AutoCommit} = 0;
 
 #
 # Test of the "pg_notifies" database handle method
-- 
1.8.4

Reply via email to