r14949@rob-kinyons-computer (orig r8702): rkinyon | 2007-01-24 23:08:35 -0500
[dbsrgits/DBM-Deep.git] / t / 40_freespace.t
CommitLineData
9a63e1f2 1##
2# DBM::Deep Test
3##
4use strict;
5use Test::More tests => 13;
6use Test::Exception;
7use t::common qw( new_fh );
8
9use_ok( 'DBM::Deep' );
10
11{
12 my ($fh, $filename) = new_fh();
13 my $db = DBM::Deep->new({
14 file => $filename,
15 autoflush => 1,
16 });
17
18 $db->{foo} = '1234';
19 $db->{foo} = '2345';
20
21 my $size = -s $filename;
22 $db->{foo} = '3456';
23 cmp_ok( $size, '==', -s $filename, "A second overwrite doesn't change size" );
24
25 $size = -s $filename;
26 delete $db->{foo};
27 cmp_ok( $size, '==', -s $filename, "Deleted space isn't released" );
28
29 $db->{bar} = '2345';
30 cmp_ok( $size, '==', -s $filename, "Added a new key after a delete reuses space" );
31
32 $db->{baz} = {};
33 $size = -s $filename;
34
35 delete $db->{baz};
36 $db->{baz} = {};
37
38 cmp_ok( $size, '==', -s $filename, "delete and rewrite reuses space" );
39
40 $db->{baz} = {};
41 $size = -s $filename;
42
43 $db->{baz} = {};
44
45 cmp_ok( $size, '==', -s $filename, "delete and rewrite reuses space" );
46
47 my $x = { foo => 'bar' };
48 $db->{floober} = $x;
49
50 delete $db->{floober};
51
52 ok( !exists $x->{foo}, "Deleting floober makes \$x empty (exists)" );
53 is( $x->{foo}, undef, "Deleting floober makes \$x empty (read)" );
54 is( delete $x->{foo}, undef, "Deleting floober makes \$x empty (delete)" );
55
56 eval { $x->{foo} = 'bar'; };
57 like( $@, qr/Cannot write to a deleted spot in DBM::Deep/, "Exception thrown when writing" );
58
59 cmp_ok( scalar( keys %$x ), '==', 0, "Keys returns nothing after deletion" );
60}
61
62{
63 my ($fh, $filename) = new_fh();
64 my $db = DBM::Deep->new({
65 file => $filename,
66 autoflush => 1,
67 });
68
69 $db->{ $_ } = undef for 1 .. 4;
70 delete $db->{ $_ } for 1 .. 4;
71 cmp_ok( keys %{ $db }, '==', 0, "We added and removed 4 keys" );
72
73 # So far, we've written 4 keys. Let's write 13 more keys. This should -not-
74 # trigger a reindex. This requires knowing how much space is taken. Good thing
75 # we wrote this dreck ...
76 my $size = -s $filename;
77
f72b2dfb 78 my $data_sector_size = $db->_engine->data_sector_size;
79 my $expected = $size + 9 * ( 2 * $data_sector_size );
9a63e1f2 80
81 $db->{ $_ } = undef for 5 .. 17;
82
83 cmp_ok( $expected, '==', -s $filename, "No reindexing after deletion" );
84}