r15625@rob-kinyons-computer (orig r9171): rkinyon | 2007-02-26 11:56:32 -0500
[dbsrgits/DBM-Deep.git] / t / 27_filehandle.t
1 ##
2 # DBM::Deep Test
3 ##
4 use strict;
5 use Test::More tests => 14;
6 use Test::Exception;
7 use t::common qw( new_fh );
8
9 use_ok( 'DBM::Deep' );
10
11 {
12     my ($fh, $filename) = new_fh();
13
14     # Create the datafile to be used
15     {
16         my $db = DBM::Deep->new( $filename );
17         $db->{hash} = { foo => [ 'a' .. 'c' ] };
18     }
19
20     {
21         open(my $fh, '<', $filename) || die("Can't open '$filename' for reading: $!\n");
22
23         my $db;
24
25         # test if we can open and read a db using its filehandle
26
27         ok(($db = DBM::Deep->new(fh => $fh)), "open db in filehandle");
28         ok($db->{hash}->{foo}->[1] eq 'b', "and get at stuff in the database");
29         throws_ok {
30             $db->{foo} = 1;
31         } qr/Cannot write to a readonly filehandle/,
32         "Can't write to a read-only filehandle";
33         ok( !$db->exists( 'foo' ), "foo doesn't exist" );
34
35         my $db_obj = $db->_get_self;
36         ok( $db_obj->_storage->{inode}, "The inode has been set" );
37
38         close($fh);
39     }
40 }
41
42 # now the same, but with an offset into the file.  Use the database that's
43 # embedded in the test for the DATA filehandle.  First, find the database ...
44 {
45     my ($fh,$filename) = new_fh();
46
47     print $fh "#!$^X\n";
48     print $fh <<'__END_FH__';
49 use strict;
50 use Test::More no_plan => 1;
51 Test::More->builder->no_ending(1);
52 Test::More->builder->{Curr_Test} = 12;
53
54 use_ok( 'DBM::Deep' );
55
56 my $db = DBM::Deep->new({
57     fh => *DATA,
58 });
59 is($db->{x}, 'b', "and get at stuff in the database");
60 __END_FH__
61     print $fh "__DATA__\n";
62     close $fh;
63
64     my $offset = do {
65         open my $fh, '<', $filename;
66         while(my $line = <$fh>) {
67             last if($line =~ /^__DATA__/);
68         }
69         tell($fh);
70     };
71
72     {
73         my $db = DBM::Deep->new({
74             file        => $filename,
75             file_offset => $offset,
76 #XXX For some reason, this is needed to make the test pass. Figure out why later.
77 locking => 0,
78         });
79
80         $db->{x} = 'b';
81         is( $db->{x}, 'b', 'and it was stored' );
82     }
83
84     {
85         open my $fh, '<', $filename;
86         my $db = DBM::Deep->new({
87             fh          => $fh,
88             file_offset => $offset,
89         });
90
91         is($db->{x}, 'b', "and get at stuff in the database");
92
93         ok( !$db->exists( 'foo' ), "foo doesn't exist yet" );
94         throws_ok {
95             $db->{foo} = 1;
96         } qr/Cannot write to a readonly filehandle/, "Can't write to a read-only filehandle";
97         ok( !$db->exists( 'foo' ), "foo still doesn't exist" );
98
99         is( $db->{x}, 'b' );
100     }
101
102     exec( "$^X -Iblib/lib $filename" );
103 }