Fixed a bug with DBI iterators and made the tets self-bootstrapping and added the...
[dbsrgits/DBM-Deep.git] / t / 41_transaction_multilevel.t
1 use strict;
2 use Test::More;
3 use Test::Deep;
4 use t::common qw( new_dbm );
5
6 use_ok( 'DBM::Deep' );
7
8 my $dbm_factory = new_dbm(
9     locking   => 1,
10     autoflush => 1,
11     num_txns  => 2,
12 );
13 while ( my $dbm_maker = $dbm_factory->() ) {
14     my $db1 = $dbm_maker->();
15     my $db2 = $dbm_maker->();
16
17     $db1->{x} = { xy => { foo => 'y' } };
18     is( $db1->{x}{xy}{foo}, 'y', "Before transaction, DB1's X is Y" );
19     is( $db2->{x}{xy}{foo}, 'y', "Before transaction, DB2's X is Y" );
20
21     $db1->begin_work;
22
23         cmp_bag( [ keys %$db1 ], [qw( x )], "DB1 keys correct" );
24         cmp_bag( [ keys %$db2 ], [qw( x )], "DB2 keys correct" );
25
26         cmp_bag( [ keys %{$db1->{x}} ], [qw( xy )], "DB1->X keys correct" );
27         cmp_bag( [ keys %{$db2->{x}} ], [qw( xy )], "DB2->X keys correct" );
28
29         cmp_bag( [ keys %{$db1->{x}{xy}} ], [qw( foo )], "DB1->X->XY keys correct" );
30         cmp_bag( [ keys %{$db2->{x}{xy}} ], [qw( foo )], "DB2->X->XY keys correct" );
31
32         is( $db1->{x}{xy}{foo}, 'y', "After transaction, DB1's X is Y" );
33         is( $db2->{x}{xy}{foo}, 'y', "After transaction, DB2's X is Y" );
34
35         $db1->{x} = { yz => { bar => 30 } };
36         ok( !exists $db1->{x}{xy}, "DB1: After reassignment of X, X->XY is gone" );
37         is( $db2->{x}{xy}{foo}, 'y', "DB2: After reassignment of DB1 X, X is Y" );
38
39         cmp_bag( [ keys %{$db1->{x}} ], [qw( yz )], "DB1->X keys correct" );
40         cmp_bag( [ keys %{$db2->{x}} ], [qw( xy )], "DB2->X keys correct" );
41
42     $db1->rollback;
43
44     cmp_bag( [ keys %$db1 ], [qw( x )], "DB1 keys correct" );
45     cmp_bag( [ keys %$db2 ], [qw( x )], "DB2 keys correct" );
46
47     cmp_bag( [ keys %{$db1->{x}} ], [qw( xy )], "DB1->X keys correct" );
48     cmp_bag( [ keys %{$db2->{x}} ], [qw( xy )], "DB2->X keys correct" );
49
50     cmp_bag( [ keys %{$db1->{x}{xy}} ], [qw( foo )], "DB1->X->XY keys correct" );
51     cmp_bag( [ keys %{$db2->{x}{xy}} ], [qw( foo )], "DB2->X->XY keys correct" );
52
53     is( $db1->{x}{xy}{foo}, 'y', "Before transaction, DB1's X is Y" );
54     is( $db2->{x}{xy}{foo}, 'y', "Before transaction, DB2's X is Y" );
55
56     $db1->begin_work;
57
58         cmp_bag( [ keys %$db1 ], [qw( x )], "DB1 keys correct" );
59         cmp_bag( [ keys %$db2 ], [qw( x )], "DB2 keys correct" );
60
61         cmp_bag( [ keys %{$db1->{x}} ], [qw( xy )], "DB1->X keys correct" );
62         cmp_bag( [ keys %{$db2->{x}} ], [qw( xy )], "DB2->X keys correct" );
63
64         cmp_bag( [ keys %{$db1->{x}{xy}} ], [qw( foo )], "DB1->X->XY keys correct" );
65         cmp_bag( [ keys %{$db2->{x}{xy}} ], [qw( foo )], "DB2->X->XY keys correct" );
66
67         is( $db1->{x}{xy}{foo}, 'y', "After transaction, DB1's X is Y" );
68         is( $db2->{x}{xy}{foo}, 'y', "After transaction, DB2's X is Y" );
69
70         $db1->{x} = { yz => { bar => 30 } };
71         ok( !exists $db1->{x}{xy}, "DB1: After reassignment of X, X->XY is gone" );
72         is( $db2->{x}{xy}{foo}, 'y', "DB2: After reassignment of DB1 X, X->YZ is Y" );
73
74         cmp_bag( [ keys %{$db1->{x}} ], [qw( yz )], "DB1->X keys correct" );
75         cmp_bag( [ keys %{$db2->{x}} ], [qw( xy )], "DB2->X keys correct" );
76
77     $db1->commit;
78
79     cmp_bag( [ keys %$db1 ], [qw( x )], "DB1 keys correct" );
80     cmp_bag( [ keys %$db2 ], [qw( x )], "DB2 keys correct" );
81
82     cmp_bag( [ keys %{$db1->{x}} ], [qw( yz )], "DB1->X keys correct" );
83     cmp_bag( [ keys %{$db2->{x}} ], [qw( yz )], "DB2->X keys correct" );
84
85     cmp_bag( [ keys %{$db1->{x}{yz}} ], [qw( bar )], "DB1->X->XY keys correct" );
86     cmp_bag( [ keys %{$db2->{x}{yz}} ], [qw( bar )], "DB2->X->XY keys correct" );
87 }
88
89 done_testing;