1# Before `make install' is performed this script should be runnable with 2# `make test'. After `make install' it should work as `perl OpenBSD-MkTemp.t' 3 4######################### 5 6# change 'tests => 1' to 'tests => last_test_to_print'; 7 8use strict; 9use warnings; 10 11use Test::More; 12use Errno; 13use FileHandle; 14use Scalar::Util qw( openhandle ); 15BEGIN { use_ok('OpenBSD::MkTemp') }; 16 17######################### 18 19my $tmpdir = $ENV{TMPDIR} || "/tmp"; 20my $top_base = "$tmpdir/test."; 21 22my $dir = OpenBSD::MkTemp::mkdtemp($top_base . "X" x 10); 23 24if (! $dir) { 25 BAIL_OUT("unable to create test directory: $!\n(is $tmpdir unwritable?)"); 26} 27 28# clean things up afterwards 29eval 'END { my $ret = $?; system("rm", "-rf", $dir); $? = $ret }'; 30 31like($dir, qr/^\Q$top_base\E[a-zA-Z0-9]{10}$/, "mkdtemp output format"); 32ok(-d $dir, "mkdtemp created directory"); 33my $mode = (stat(_))[2]; 34cmp_ok($mode & 07777, '==', 0700, "mkdtemp directory mode"); 35 36 37my $base = "$dir/f."; 38my $template = $base . "X" x 10; 39 40my($fh1, $file1) = mkstemp($template); 41 42like($file1, qr/^\Q$base\E[a-zA-Z0-9]{10}$/, "mkstemp output format"); 43ok(-f $file1, "mkstemp created filed"); 44my @stat = stat(_); 45cmp_ok($stat[2] & 07777, '==', 0600, "mkstemp file mode"); 46 47my @fstat = stat($fh1); 48is_deeply(\@stat, \@fstat, "file name matches the handle"); 49 50 51my($fh2, $file2) = OpenBSD::MkTemp::mkstemps($template, ".foo"); 52 53like($file2, qr/^\Q$base\E[a-zA-Z0-9]{10}\.foo$/, "mkstemps output format"); 54ok(-f $file2, "mkstemps created filed"); 55@stat = stat(_); 56cmp_ok($stat[2] & 07777, '==', 0600, "mkstemps file mode"); 57 58@fstat = stat($fh2); 59is_deeply(\@stat, \@fstat, "file name matches the handle"); 60 61 62my $fileno = fileno($fh2); 63undef $fh2; 64open(F, ">$file2") || die "$0: unable to open $file2: $!"; 65cmp_ok(fileno(F), '==', $fileno, "mkstemp file handle ref counting"); 66 67subtest "mkstemp in scalar context" => sub { 68 plan tests => 2; 69 ok my $fh = OpenBSD::MkTemp::mkstemp($template); 70 is openhandle($fh), $fh, "mkstemp returns a filehandle in scalar mode"; 71}; 72 73subtest "mkstemps in scalar context" => sub { 74 plan tests => 2; 75 ok my $fh = OpenBSD::MkTemp::mkstemps($template, ".foo"); 76 is openhandle($fh), $fh, "mkstemps returns a filehandle in scalar mode"; 77}; 78 79# 80# How about some failures? 81# 82 83my $d2 = OpenBSD::MkTemp::mkdtemp($file1 . "/fXXXXXXXXXX"); 84my $err = $!; 85subtest "mkdtemp failed on bad prefix" => sub { 86 plan tests => 2; 87 ok(! defined($d2), "no directory name"); 88 cmp_ok($err, '==', Errno::ENOTDIR, "right errno"); 89}; 90 91if ($> != 0) { 92 $d2 = OpenBSD::MkTemp::mkdtemp("/fXXXXXXXXXX"); 93 $err = $!; 94 subtest "mkdtemp failed on no access" => sub { 95 plan tests => 2; 96 ok(! defined($d2), "no directory name"); 97 cmp_ok($err, '==', Errno::EACCES, "right errno"); 98 }; 99} 100 101my($fh3, $file3) = mkstemp($file1 . "/fXXXXXXXXXX"); 102$err = $!; 103subtest "mkstemp failed on bad prefix" => sub { 104 plan tests => 3; 105 ok(! defined($fh3), "no filehandle"); 106 ok(! defined($file3), "no filename"); 107 cmp_ok($err, '==', Errno::ENOTDIR, "right errno"); 108}; 109 110if ($> != 0) { 111 ($fh3, $file3) = mkstemp("/fXXXXXXXXXX"); 112 $err = $!; 113 subtest "mkstemp failed on no access" => sub { 114 plan tests => 3; 115 ok(! defined($fh3), "no filehandle"); 116 ok(! defined($file3), "no filename"); 117 cmp_ok($err, '==', Errno::EACCES, "right errno"); 118 }; 119} 120 121eval { OpenBSD::MkTemp::mkstemps_real("foo", 0) }; 122like($@, qr/read-only value/, "unwritable template"); 123 124eval { my $f = "foo"; OpenBSD::MkTemp::mkstemps_real($f, -3) }; 125like($@, qr/invalid suffix/, "invalid suffix"); 126 127done_testing(); 128 129