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